实体框架4.1代码优先 - 控制预先加载

时间:2011-09-12 17:40:25

标签: c# entity-framework-4.1 ef-code-first

是否可以控制子对象的急切加载。

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

如果是,我将如何编写查询?

例如:

我有一个名为Book的实体,它有许多相关的评论:

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条

1 个答案:

答案 0 :(得分:3)

Include不允许任何过滤或排序。一种选择是使用明确的加载:

// 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();

它需要两次往返数据库(这在性能方面不一定是坏的,因为另一方面急切加载可能带有lots of duplicated data)。

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