实体框架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条

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

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(现在已删除)所显示的解决方案。