2015-03-12 2 views
0

This страница означает, что я могу сделать что-то вроде этого:Что делает «совокупный список» для групп LINQ по предложениям?

From thing In things 
Group By thing.ID Into result = Group, Sum(thing.value) 

А потом быть в состоянии использовать Sum значений позже. Возможно, в чем-то вроде этого (на самом деле не работает код):

From thing In things 
Group By thing.name Into results = Group, Sum(thing.value) 
Where results.Sum >= 10 
From result In results 
Select result 

Это должно выбрать все thing S, где сумма значений thing с с тем же именем больше, чем 10.

Через более тестирования, Я не могу получить results, чтобы быть чем-то другим, кроме первого элемента в так называемом сводном списке. Другими словами, следующие эффективно идентичны, насколько я могу сказать:

Group By thing.name Into results = Group, Sum(thing.value) 

Group By thing.name Into results = Group 

Что такое совокупный список даже должен делать, и как я могу его использовать?

Сторона примечания: Пример в ссылке, по-видимому, используется Count вместо Sum, но на самом деле использует два разных определения Count и в данном случае бесполезен.

+0

В вашем втором блоке кода, попробуйте 'Где Sum> = 10' , После 'Group By' я думаю, что у вас есть перечисление анонимных типов с свойствами' name', 'results' и' Sum'. 'results' - это список соответствующих' thing'. Вы также можете назвать 'Sum' иначе, например, 'total = Sum (thing.Value)'. – Mark

ответ

1

Это помогает понять, что именно происходит при выполнении запроса linq.

Когда вы выполняете группу по синтаксису запроса, вы создаете объекты результата с именами свойств ключа и агрегатов.

Ваш запрос:

From thing In things 
Group By thing.ID Into result = Group, Sum(thing.value) 

Урожайность коллекцию объектов со свойствами:

ID - ключ (неявно взяты из ID собственности)
result - совокупность элементов, которая в группе (явный псевдоним Group)
Sum - сумма добавления value (неявно взято из названия агрегата)

Как только вы это понимаете, вы можете сделать больше фильтрации. Чтобы отфильтровать результаты, где сумма меньше, чем 10:

From thing In things 
Group By thing.ID Into result = Group, Sum(thing.value) 
Where Sum < 10 

Таким образом, чтобы исправить другой запрос, вы могли бы сделать это:

From thing In things 
Group By thing.name Into results = Group, Sum(thing.value) 
Where Sum >= 10 
From result In results 
Select result 
+0

Хорошо, так это работает. Но что, если бы я хотел получить сумму многих столбцов, как я могу их называть? – Whanhee

+1

Вам придется назначить псевдоним каждой из сумм. 'result = Group' берет' Group' элементов и присваивает его свойству 'result'. Поэтому вам понадобится что-то вроде: sum1 = Sum (вещь.value1), sum2 = Sum (вещь.значение2), sum3 = Sum (вещь.значение3) '. В vb.net имя неявно берется из используемого метода агрегации. C#, с другой стороны, вы должны явно называть его. –

+0

Я вижу. Хорошо, спасибо за помощь! – Whanhee

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