#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
свойства.