Entity Framework dbSet.Include (x = ›x.Offer.Images.Where (y =› y.IsDeleted == false))

Как мне преобразовать этот запрос в действительный запрос Entity Framework?

dbSet.Include(x=>x.Offer.Images.Where(y=>y.IsDeleted == false))

Предложение Where вызывает исключение:

Выражение пути Include должно ссылаться на свойство навигации, определенное для типа. Используйте пунктирные пути для свойств навигации по ссылкам и оператор Select для свойств навигации по коллекции.

Я уже пробовал стороннюю библиотеку IncludeFilter, которая работает. Однако это не позволяет мне использовать другой include:

dbSet.Include(x=>x.Offer.Images.Where(y=>y.IsDeleted == false)).Include(x=>x.Demand)

Большое спасибо :-)


person Lopuch    schedule 15.08.2018    source источник


Ответы (2)


Include - это просто маркер, сообщающий EF о необходимости загрузки связанных сущностей. Он не поддерживает загрузку выбранного подмножества родственников, например активных элементов.

При работе с моделью с мягким удалением (IsDeleted / IsActive) будет заполнять модели представления активными дочерними элементами. Преимущество возврата моделей представления для операций чтения состоит в том, что вы избегаете потенциальных сценариев с отложенной загрузкой и просто извлекаете данные, которые вам нужно использовать. Для операций редактирования я буду загружать связанные данные, и обычно мне нужны как активные, так и неактивные записи.

var viewModels = dbset.Select(x => new MyVM
{
  Objectid = x.ObjectId,
  // ...
  Offer = new OfferViewModel
  {
    OfferId = x.Offer.OfferId,
    // ...
    Images = x.Offer.Images
      .Where(i => !i.IsDeleted) // Load only active images
      .Select(i => new ImageViewModel 
      {
        ImageId = i.ImageId,
        //...
      }).ToList()
  }
}

Обратите внимание, что для этого не нужны явные инструкции .Include(), просто загрузите нужные данные.

Когда я перехожу к сохранению изменений в графе сущностей, я загружаю корневую сущность с помощью .Include(x => x.Order).Include(x => x.Order.Images), чтобы убедиться, что у меня есть все относительные данные. EF следует знать о полной коллекции перед применением обновлений, чтобы избежать сюрпризов, таких как повторяющиеся попытки вставки записей.

person Steve Py    schedule 15.08.2018
comment
Спасибо, мне это очень помогло. Не могли бы вы поделиться ссылкой или книгой, где можно узнать больше о Linq? Я ищу продвинутые темы, а не основы. - person Lopuch; 16.08.2018
comment
Я не знаю ни одного отличного от Linq, кроме Googling, но хорошее описание некоторых соображений производительности для EF было бы таким: red-gate.com/simple-talk/dotnet/net- инструменты / - person Steve Py; 16.08.2018

Я уже пробовал стороннюю библиотеку IncludeFilter, которая работает. Однако это не позволяет мне использовать другой include:

Когда вы начинаете использовать IncludeFilter, вам нужно продолжать использовать его полностью, даже если вы не фильтруете.

dbSet.IncludeFilter(x=>x.Offer.Images.Where(y=>y.IsDeleted == false))
.IncludeFilter(x=>x.Demand)
person Jonathan Magnan    schedule 16.08.2018