2016-06-01 3 views
3

Привет, У меня есть DataTable вроде этого:Использование Linq для GroupBy и Сумма DataTable

 
Id    Amount 1  Amount 2  Amount 3 
1    2    2    2 
12    4    6    4 
12    6    6    5 
22    7    2    1 
22    7    2    2 

Мне нужно, чтобы получить мой DataTable, как это:

 
Id    Amount 1  Amount 2  Amount 3 
1    2    2    2 
12    10    12    9  
22    14    4    3 

Первоначально я пытался сделайте это в анонимном методе, но мне нужно вернуть его в другой класс, который не может быть выполнен с помощью анонимного метода. Моя вторая попытка была сделать это так, он может быть возвращен:

DataTable ddt = dt.AsEnumerable() 
     .Sum(g => g.Field<int>("Amount 1")) 
     .GroupBy(g => new { Col1 = g["ID"] }) 
     .Select(g => g.OrderBy(r => r["ID"]).First()) 
     .CopyToDataTable(); 

Этот код определенно не будете компилировать, но любая помощь/совет, если можно было бы очень ценна. Я очень новичок в linq.

+2

Возможный дубликат [Использовать LINQ группировать данные из DataTable] (HTTP://stackoverflow.com/questions/3829129/use-linq-to-group-data-from-datatable) – MethodMan

+0

google может быть вашим лучшим другом при правильном использовании – MethodMan

+0

Вам нужно сделать группу сначала, затем в выбранном вами делать каждую сумму. – juharr

ответ

8

Вы можете GroupBy первым, а затем спроецировать групп DataRow с, а затем создать DataTable используя CopyToDataTable расширение:

var newDt = dt.AsEnumerable() 
       .GroupBy(r => r.Field<int>("Id")) 
       .Select(g => 
       { 
        var row = dt.NewRow(); 

        row["Id"] = g.Key; 
        row["Amount 1"] = g.Sum(r => r.Field<int>("Amount 1")); 
        row["Amount 2"] = g.Sum(r => r.Field<int>("Amount 2")); 
        row["Amount 3"] = g.Sum(r => r.Field<int>("Amount 3")); 

        return row; 
       }).CopyToDataTable(); 
0

Вы делаете свои звонки не в порядке. Код ниже не помещает данные в таблицу, но это даст вам данные, которые вы можете легко вставить в таблицу.

dt.AsEnumberable() 
    .GroupBy(g => g["ID]) 
    .Select(g => new { 
     Id = g.Key, 
     Amount1 = g.Sum(s => s.Amount1), 
     Amount2 = g.Sum(s => s.Amount2), 
     Amount3 = g.Sum(s => s.Amount3)}); 
Смежные вопросы