是否可以控制子对象的急切加载。
如果我有一个拥有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条
答案 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显示的解决方案(现已删除)。