2011-09-12 69 views
1

是否有可能控制子对象的急切加载。实体框架4.1代码优先 - 控制渴望加载

如果我有一个拥有20,000个子对象的父类,并且我只想检索这些子对象的子集,有可能吗?

我该如何编写查询来做到这一点?

例如:

我有一个实体,称为书里面有许多相关的评论:

public class Book { 
    public int BookId { get; set; } 
    public string BookName { get; set; } 
    public ICollection<Review> Reviews { get; set; } 
} 

public class Review { 
    public int ReviewId { get; set; } 
    public int Score { get; set; } 
    public Book Book { get; set; } 
} 

我想要做的事,如:

var bookWithFirstTwentyReviews = db.Books.Where(b => b.BookId == 1).Include("Reviews").FirstOrDefault(); 

但我只想要包括20条评论,并非全部为20,000

+0

你是指选择性加载子集合的一个子集或完全独立的子对象? – BrokenGlass

+0

更新我的帖子以显示我想要的内容。 – Dismissile

+0

@BrokenGlass:你为什么删除你的答案?我很确定这是一种工作方式。 – Slauma

回答

3

Include不允许任何f过滤或分类。一种选择是使用explicite加载:

// load book without Reviews (1st roundtrip to DB) 
var book = context.Books.Where(b => b.Id == id).SingleOrDefault(); 

// then load a filtered collection of Reviews (2nd roundtrip to DB) 
if (book != null) 
    context.Entry(book).Collection(b => b.Reviews).Query().Take(20).Load(); 

它需要两个往返到数据库中,但(这不一定是坏事,performancewise,因为另一方面预先加载带有潜在lots of duplicated data)。

另一种方法是在上下文中使用投影和杠杆关系跨度。这是@BrokenGlass显示的解决方案(现在删除)。