DbQuery.Include()的重载去了哪里需要一个lambda?

Tim*_*mwi 71 c# entity-framework

我刚刚为使用EntityFramework的新项目声明了一些代码优先模型.

public class BlogEntry
{
    public long Id { get; set; }
    public long AuthorId { get; set; }
    public DateTime PublishedStamp { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }

    public virtual User Author { get; set; }
}

public class User
{
    public long Id { get; set; }
    public string Email { get; set; }
    // ...
}

class BlogDb : DbContext
{
    public DbSet<BlogEntry> Entries { get; set; }
    public DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在假设我要检索最近的10个博客条目:

var entries = new BlogDb().Entries.OrderByDescending(...).Take(10).ToList();
Run Code Online (Sandbox Code Playgroud)

现在的问题是访问entry.Author将导致另一个数据库查询.您不希望为每个博客条目单独进行此类查询.现在,我的理解是,目的Include正是这种情况,所以我可以说:

var entries = new BlogDb().Entries.Include(e => e.Author).(...).ToList();
Run Code Online (Sandbox Code Playgroud)

但是,该方法似乎并不存在.只有一个Include(string),像这样:

var entries = new BlogDb().Entries.Include("Author").(...).ToList();
Run Code Online (Sandbox Code Playgroud)

但这很烦人,因为它不是编译时检查的,重命名重构会遗漏它.当然,带有lambda的版本是"正确的"方法.

那个方法去哪儿了?它是否不再包含在EntityFramework中?

(我知道我可以为自己编写一个扩展方法来实现这一点,所以你不必这样做.我只想知道我是否遗漏了什么.)

Not*_*ple 103

using System.Data.Entity;
Run Code Online (Sandbox Code Playgroud)

它在EF v4.1及更高版本中,但您需要一个引用,因为它是一种扩展方法.


编辑 (感谢@EastonJamesHarvey)

如果使用EF Core,则导入应为:

using Microsoft.EntityFrameworkCore;
Run Code Online (Sandbox Code Playgroud)

  • 它是IQueryable <T>的扩展方法,因此您可以在LINQ查询中的任何位置使用它.如果它仅在DbQuery <T>或类似的上定义,那么只要您使用其他方法(如.Where,.OrderBy等),就不会再看到该方法,因为这些方法的返回类型是IQueryable < T>. (6认同)
  • 我对4.1的引用感到困惑.请注意,***需要引用EF 4.1才能访问所需的Include扩展方法.它是EF 6.0.2中提供的`System.Data.Entity.QueryableExtensions`对象的一种方法(本文撰写时的最新内容).您只需导入正确的命名空间即可访问它. (2认同)