使用Linq进行列求和

时间:2019-06-10 21:49:54

标签: c# linq

我的要求是合并ID相同且各列具有相同值的行,并汇总其Amount和Percentage列。

下面给出的数据表示例-

Datatable (dtrec)

 COL1   COL2  COL3     ID     AMT   PERCENTAGE  COL4
-----------------------------------------------------
 2022   2024   2021   5001    400     .20     213
 2022   2024   2021   5001    400     .20
 2031   2021   2134   6001    500     .20

预期结果-

Desired Output - Datatable (dtrec) 
COL1  COL2   COL3  ID   AMT  PERCENTAGE  COL4
 ----------------------------------------------------- 
2022  2024  2021  5001  800   .40         213 
2031  2021  2134  6001  500   .20

通过使用贝娄linq语句,我收到了类似贝娄的输出-

DataTable dt = dtrec.AsEnumerable()
                .GroupBy(r => r.Field<decimal>("ID"))
                 .Select(g =>
                 {
                       var row = dtrec.NewRow();
                       row["ID"] = g.Key;
                       row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
                       row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
                       return row;
                 }).CopyToDataTable();
Datatable (dt)
COL1  COL2   COL3  ID   AMT  PERCENTAGE  COL4
 ----------------------------------------------------- 
                    5001  800   .40         
                    6001  500   .20        

如上所述,我的要求是 linq语句,该语句将从数据表中选择所有列,此外还将对AMT和PERCENTAGE列求和。如预期结果所示。

要考虑的另一个重要点是,除了ID列,AMT列和PERCENTAGE列以外,其他列也是动态的,即列可能会增加或减少(例如COL1,COL2,COL3,COL4,COL5 ...等),因此我们不能包括COL1或select语句中有COL4。

任何建议都会有所帮助。

谢谢

1 个答案:

答案 0 :(得分:1)

只需将需要汇总的列添加到查询中即可。

DataTable dt = dtrec.AsEnumerable()
    .GroupBy(r => r.Field<decimal>("ID"))
     .Select(g =>
     {
         var row = dtrec.NewRow();
         row["COL1"] = g.Sum(r => r.Field<decimal>("COL1"));
         row["ID"] = g.Key;
         row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
         row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
         row["COL4"] = g.Sum(r => r.Field<decimal>("COL4"));
         return row;
     }).CopyToDataTable();