我的要求是合并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。
任何建议都会有所帮助。
谢谢
答案 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();