在实体框架代码中,首先有一种方法可以向导航集合添加分页吗?

Jas*_*son 7 collections paging entity-framework ef-code-first

如果我有一个博客实体,其BlogEntries集合可能有数百个条目,是否有办法首先使用EF代码添加任何服务器端分页功能?例如,如果我像在DbSet上那样做一个典型的.Skip(x).Take(y),它是否会延迟加载整个集合并将其分页到内存中?

Lad*_*nka 15

如果直接查询DbSet,可以使用Take和Skip,它确实会在数据库服务器上执行分页(这些方法调用被转换为SQL).所以这按预期工作:

// Loads only 10 expected entries through Linq-to-entities
var entries = context.BlogEntries.OrderBy(e => e.Date).Skip(10).Take(10);
Run Code Online (Sandbox Code Playgroud)

请注意加载的实体上的分页导航属性不能以这种方式工作:

var blog = context.Blogs.First();
// Lazy loading always loads all related entries and executes ordering and 
// paging through Linq-to-objects!
var entires = blog.BlogEntries.OrderBy(e => e.Date).Skip(10).Take(10);
Run Code Online (Sandbox Code Playgroud)

如果要在导航属性上获取分页,则必须使用显式加载

var blog = context.Blogs.First();
var dbEntry = context.Entry(blog);
// This is the way to use Linq-to-entities on navigation property and 
// load only subset of related entities
var entries = dbEntry.Collection(b => b.BlogEntries)
                     .Query()
                     .OrderBy(e => e.Date)
                     .Skip(10)
                     .Take(10)
                     .Load();
Run Code Online (Sandbox Code Playgroud)