Фильтрация Linq к объекту при отложенной загрузке 3 уровня вложенного запроса

#entity-framework-4 #linq-to-entities

#entity-framework-4 #linq-to-entities

Вопрос:

Предполагая Entity Framework в контексте ленивой загрузки.

У нас есть 3 объекта:

  • Продукт (который содержит много деталей заказа)
  • OrderDetails (который содержит много деталей)
  • Подробнее

Следующий запрос выводит все продукты с именем=Books. И к каждому из этих продуктов загружаются все детали заказа, у которых количество деталей заказа>5.

 var query = anEntityManager.Products.Where(p => p.Name == "Books")
.Select(p => new { Product = p, OrderDetails = p.OrderDetails.Where(od => od.Quantity >       5) });
var results = query.ToList();
var products = results.Select( x => x.Product);
  

Моя проблема в том, что детали каждого OrderDetail не извлекаются из базы данных. Как я могу включить в этот запрос, чтобы детали также загружались из базы данных в том же запросе?

Ответ №1:

Я думаю, вам нужно расширить свою проекцию:

 var query = anEntityManager.Products.Where(p => p.Name == "Books")
    .Select(p => new
    {
        Product = p,
        OrderDetails = p.OrderDetails.Where(od => od.Quantity > 5),
        Details = p.OrderDetails.Where(od => od.Quantity > 5)
                                .SelectMany(od => od.Details)
    });
var results = query.ToList();
var products = results.Select( x => x.Product);
  

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

Вероятно, вы также можете использовать Select вместо SelectMany ( Details тогда это было бы IEnumerable<IEnumerable<Detail>> вместо flat IEnumerable<Detail> ), потому что вы все равно отбрасываете проектируемые свойства — кроме Product свойства.