Using Linq to GroupBy and Sum datatable

前端 未结 3 1499
感动是毒
感动是毒 2021-01-02 14:02

Hi, I have a Datatable like this:

Id             Amount 1        Amount 2        Amount 3  
1              2               2               2  
12         


        
相关标签:
3条回答
  • 2021-01-02 14:33

    You are making your calls out of order. The code below wont put the data into a table, but it will give you data you could put into a table easily.

    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)});
    
    0 讨论(0)
  • 2021-01-02 14:36

    You can GroupBy first, then project the groups to DataRows, then create the DataTable using CopyToDataTable extension:

    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 讨论(0)
  • 2021-01-02 14:44

    This works for me. A slight Change to Arturo's code to help with cast issues if you have decimal values and use a datatable as a datatable not a variable. (Note that r[15] is the column you will be summing)

                      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();
    
    0 讨论(0)
提交回复
热议问题