通过


显式加载相关数据

显式加载

可以通过 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();
}