显式加载
可以通过 API 显式加载导航属性 DbContext.Entry(...) 。
using (var context = new BloggingContext())
{
var blog = await context.Blogs
.SingleAsync(b => b.BlogId == 1);
await context.Entry(blog)
.Collection(b => b.Posts)
.LoadAsync();
await context.Entry(blog)
.Reference(b => b.Owner)
.LoadAsync();
}
还可以通过执行返回相关实体的单独查询来显式加载导航属性。 如果启用了更改跟踪,则当查询具体化实体时,EF Core 将自动设置新加载实体的导航属性以引用已加载的任何实体,并设置已加载实体的导航属性以引用新加载的实体。
查询相关实体
还可以获取表示导航属性内容的 LINQ 查询。
这样,就可以对查询应用其他运算符。 例如,在不将聚合运算符加载到内存中的情况下,对相关实体应用聚合运算符。
using (var context = new BloggingContext())
{
var blog = await context.Blogs
.SingleAsync(b => b.BlogId == 1);
var postCount = await context.Entry(blog)
.Collection(b => b.Posts)
.Query()
.CountAsync();
}
还可以筛选哪些相关实体加载到内存中。
using (var context = new BloggingContext())
{
var blog = await context.Blogs
.SingleAsync(b => b.BlogId == 1);
var goodPosts = await context.Entry(blog)
.Collection(b => b.Posts)
.Query()
.Where(p => p.Rating > 3)
.ToListAsync();
}