实体框架4.1代码优先-控制急切加载
本文关键字:控制 加载 框架 代码 实体 | 更新日期: 2023-09-27 18:08:34
是否可以控制子对象的快速加载?
如果我有一个父类,有20000个子对象,我只想检索这些子对象的一个子集是可能的吗?
如果是的话,我该怎么写查询呢?
例如:我有一个名为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条
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();
它需要两次到数据库的往返(这在性能方面并不一定是坏的,因为另一方面,急切加载可能会带来大量重复的数据)。
另一种方法是在上下文中使用投影并利用关系跨度。这是@BrokenGlass(现在已删除)所显示的解决方案。