Откуда взялась перегрузка DbQuery.Включить() пойти, что принимает лямбда-выражение?


Я только что объявил некоторые первые модели кода для нового проекта, который использует 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();

но это раздражает, потому что он не проверяется во время компиляции и будет пропущен рефакторингом переименования. Конечно, версия с лямбда - это "правильный" подход.

куда делся этот метод? Он больше не включен в EntityFramework?

(Я знаю, что могу написать метод расширения для себя, чтобы достичь этого, так что вам не нужно. Я просто хотел бы знать, не пропал ли я что-то.)

1 69

1 ответ:

using System.Data.Entity;//ftw

это в EF v4.1 и выше, но вам нужна ссылка, поскольку это метод расширения.


Edit(спасибо @EastonJamesHarvey)

при использовании EF Core импорт должен быть:

using Microsoft.EntityFrameworkCore;