2013-01-22 7 views
2

У меня есть данные с колонкой «Нет» и «Всего». Я бы хотел вернуть сумму столбца «Всего» для каждого «Нет». Я пробовал ниже, но я получаю несколько ошибок, поскольку я борюсь с синтаксисом.Linq Objects Group By & Sum

var Values = 
     (from data in DtSet.Tables["tblDetails"].AsEnumerable() 
     group data by data.Field<"No"> 
     select new 
     { 
      name_1 = data.Field<double>("No"), 
      name_2 = data.Field<double>("Total"), 
     } 
     ); 
+1

'name_1' и' name_2' звучат как ужасные имена. Почему бы вам не назвать их «Нет» и «TotalSum», или что-то в этом роде? – svick

+0

хороший пример http://msdn.microsoft.com/en-us/library/bb386991.aspx – spajce

ответ

5

Это даст вам сумму Total полей в name_2 собственности, и группировка No в name_1 собственности (я думаю, что вам нужно лучше называть здесь)

var Values = from row in DtSet.Tables["tblDetails"].AsEnumerable() 
      group row by row.Field<double>("No") into g 
      select new 
      { 
       name_1 = g.Key, 
       name_2 = g.Sum(r => r.Field<double>("Total")) 
      }; 

Рассмотрим об именах No и TotalSum вместо этого.

+0

Спасибо за советы по соглашениям об именах. Ваш код работает - спасибо. Как бы я мог принести другой столбец, который не нужно суммировать, например, name_3 будет полем «AccountNo» ...? – user1936588

+1

@ user1936588 все строки с одинаковым значением 'Нет' имеют одинаковые' AccountNo'? Если да, то вы можете включить 'AccountNo' в группу группировки. В противном случае у вас будет список номеров учетных записей, таких как 'Accounts = g.Select (r => r.Field (« AccountNo »). ToList()' –

+1

Отлично, спасибо. – user1936588

1

Вы начинаете использовать LINQ, но старый добрый DataTable имеет это own way:

var total = DtSet.Tables["tblDetails"].Compute("sum(Total)", "No = x"); 

Я должен оставить его с x в нем, потому что я не знаю значения в столбце «No». Часть "No = x" является фильтром. Если это нулевая или пустая строка, все строки будут использоваться в вычислении.

+0

Итак, вы должны сделать это для каждого ' Нет. В этом случае я думаю, что это хуже, чем LINQ во всех отношениях. – svick

+0

@svick Нет, он вычисляет всю таблицу сразу. –

+1

Но вторая часть - это фильтр, нет? Так что если я хочу рассчитать сумма итогов для каждого «Нет» (который задает вопрос), я должен выполнить это для каждого «Нет». Например, если значения «Нет» равны 1,2, ... 1000, тогда мне придется выполните его с 'No = 1',' No = 2', ..., 'No = 1000'. Или я что-то упустил? – svick