2017-02-13 2 views
0

Как проверить, является ли условие действительным для любых элементов в группе, созданной с помощью Linq to sql?Проверьте, соответствует ли условие для любого элемента в группе

Допустим, у нас есть 3 стола: Invoice, Order и OrderItem.

Я хочу знать Всего всех заказов на счет-фактуру, и если у каких-либо предметов заказа из заказов на счет-фактуру есть скидки.

from o in db.Orders 
group o by new 
{ 
    InvoiceId = o.InvoiceId, 
    LocationId = o.LocationId, 
} into g 
select new 
{ 
    InvoiceId = g.Key.InvoiceId, 
    LocationId = g.Key.LocationId, 
    Total = g.Sum(x => x.Total). 
    HasDiscount = <???> 
} 

Я попытался с let discountedItems = o.OrderItems.Where(i.Discount != 0), но я не знаю, как ссылаться на правильные OrderItems.

Edit:

Заказать Свойства: Id, InvoiceId, LocationId, Total OrderItem Свойства: Id, OrderId, Discount - Допустим, скидка целое значение

ответы, которые предлагают HasDiscount = g.Any(x => x.OrderItem.Select(oi => oi.Discount != 0).FirstOrDefault()) выглядеть, что может быть это, но я беспокоюсь о производительности, так как у меня есть 300 тысяч элементов в таблице Orders и более миллиона в OrderItem. Разве это не делает запрос для каждой группы и материализует их элементы заказа?

Прошу прощения за плохое описание таблиц, пожалуйста, поймите, что это всего лишь примеры, и мой реальный случай сложнее.

+6

Я думаю, что вы ищете 'Any':' HasDiscount = g.Any (x => x.Discount! = 0)) ' –

+0

В следующий раз, пожалуйста, разместите более подробную информацию о своих объектах –

+0

Я отредактировал этот вопрос более подробно –

ответ

3

Вы можете использовать Any: -

HasDiscount = g.Any(x => x.HasDiscount) 

Если у вас есть HasDiscount булево свойство в вашей модели.

+0

Заказ не имеет HasDiscount - OrderItem имеет целочисленное поле скидки, поэтому 'HasDiscount = g.Any (x => x.OrderItem.Select (oi => oi.Discount! = 0) .FirstOrDefault())' будет делать Хитрость. Не могли бы вы прокомментировать выполнение этого подхода? –

+0

Если у вас огромные данные, почему вы делаете все это в памяти? Выполняйте всю фильтрацию в самой базе данных и возвращайте только соответствующие данные. Вы также можете запустить некоторые тесты, чтобы проверить разницу в производительности. –

Смежные вопросы