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


71

我刚刚为使用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; }
}

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

var entries = new BlogDb().Entries.OrderByDescending(...).Take(10).ToList();

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

var entries = new BlogDb().Entries.Include(e => e.Author).(...).ToList();

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

var entries = new BlogDb().Entries.Include("Author").(...).ToList();

但这很烦人,因为它没有进行编译时检查,并且会因重命名重构而丢失。带有lambda的版本肯定是“正确”的方法。

这种方法去了哪里?它不再包含在EntityFramework中吗?

(我知道我可以为自己编写一个扩展方法来实现此目的,因此您不必这样做。我只想知道我是否缺少某些东西。)

Answers:


102
using System.Data.Entity;

它在EF v4.1及更高版本中,但是您需要参考,因为它是扩展方法。


编辑 (感谢@EastonJamesHarvey)

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

using Microsoft.EntityFrameworkCore;

谢谢!但是出于好奇,为什么要使用扩展方法而不是原始方法的另一个重载?
2012年

我实际上不确定哈哈对于ADO.Net团队来说将是一个问题
不喜欢

6
它是IQueryable <T>的扩展方法,因此您可以在LINQ查询中的任何位置使用它。如果仅在DbQuery <T>或类似名称上定义它,则一旦使用其他方法(例如.Where,.OrderBy等),您将不再看到该方法,因为这些方法的返回类型为IQueryable < T>。
亚瑟·维克斯

2
我对4.1的引用感到困惑。注意您不是需要参考EF 4.1,以获得所需的包括扩展方法。这是System.Data.Entity.QueryableExtensionsEF 6.0.2中提供的对象的一种方法(撰写本文时为最新版本)。您只需要导入正确的名称空间即可访问它。
BlueMonkMN 2014年

1
现在使用netcoreapp1.0:使用Microsoft.EntityFrameworkCore;
Easton James Harvey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.