Подтвердить что ты не робот

Entity Framework Core Eager Loading Then Include on collection

У меня есть три Модели, которые я хочу включить при выполнении запроса.

Вот сценарий.

public class Sale
{
     public int Id { get; set; }
     public List<SaleNote> SaleNotes { get; set; }
}

public class SaleNote
{
    public int Id { get; set; }
    public User User { get; set; }
}

public class User 
{
    public int Id { get; set; }
}

Я могу с нетерпением загрузить SaleNotes вот так...

_dbContext.Sale.Include(s => s.SaleNotes);

Тем не менее, пытаясь с нетерпением загрузить модель User из SaleNote с помощью функции ThenInclude, это сложно, потому что это коллекция. Я не могу найти примеры того, как можно загружать этот сценарий. Может ли кто-то поставить код, который отправляется в следующем ThenInclude, чтобы загрузить пользователя для каждого элемента в коллекции.

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(...);
4b9b3361

Ответ 1

Не имеет значения, что SaleNotes - это свойство навигации для коллекции. Он должен работать одинаково для ссылок и коллекций:

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(sn=>sn.User);

Но, насколько я знаю, EF7 также поддерживает старый многоуровневый синтаксис Include с использованием метода выбора расширения:

_dbContext.Sale.Include(s => s.SaleNotes.Select(sn=>sn.User));

Ответ 2

Для справки, последняя версия EF Core (1.1.0) также поддерживает явную загрузку для этого сценария. Что-то вроде этого...

using (var _dbContext = new DbContext())
{
    var sale = _dbContext.Sale
        .Single(s => s.Id == 1);

    _dbContext.Entry(sale)
        .Collection(n => n.SalesNotes)
        .Load();

    _dbContext.Entry(sale)
        .Reference(u => u.User)
        .Load();
}