使用Linq到GroupBy和Sum数据表

时间:2016-06-01 17:27:44

标签: c# linq datatable group-by sum

嗨,我有这样的数据表:

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

我需要像这样得到我的数据表:

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很新。

3 个答案:

答案 0 :(得分:17)

您可以先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();

答案 1 :(得分:1)

这对我有用。如果您具有十进制值并且使用数据表作为数据表而不是变量,则对Arturo的代码稍作更改以解决转换问题。 (请注意,r [15]是您要累加的列)

                  dt = dt.AsEnumerable()
                    .GroupBy(r => r["fldReportCode"])
                    .Select(g =>
                     {
                        var row = dt.NewRow();

                      row["fldReportCode"] = g.Key;
                      row[15] = g.Sum(r => (decimal)r[15]);
                      //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();

答案 2 :(得分: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)});