Фильтрация Linq для Entity при отложенной загрузке 3 уровня Nested Query - PullRequest
2 голосов
/ 11 ноября 2011

Предполагая Entity Framework, в контексте LazyLoading.

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

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

Следующий запрос приводит все Продукты с Именем = Книги.И к каждому из этих продуктов загружаются все OrderDetails , которые OrderDetail.Quantity> 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 Ответ

1 голос
/ 11 ноября 2011

Я думаю, вам нужно расширить свой прогноз:

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>> вместо плоского IEnumerable<Detail>), потому что вы все равно выбрасываете спроецированные свойства - кроме Product свойство.

...