使用Linq到GroupBy和Sum数据表

嗨,我有一个像这样的数据表:

 Id金额1金额2金额3  
 1 2 2 2  
 12 4 6 4  
 12 6 6 5  
 22 7 2 1  
 22 7 2 2

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

 Id金额1金额2金额3  
 1 2 2 2  
 12 10 12 9    
 22 14 4 3

我最初尝试在匿名方法中执行此操作但我需要将其返回到另一个无法使用匿名方法完成的类。 我的第二次尝试是这样做,所以可以返回:

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

这段代码肯定不会编译,但如果可能的话,任何帮助/建议都会非常感激。 我对linq很新。

您可以首先进行GroupBy ,然后将组投影到DataRow ,然后使用CopyToDataTable扩展创建DataTable

 var newDt = dt.AsEnumerable() .GroupBy(r => r.Field("Id")) .Select(g => { var row = dt.NewRow(); row["Id"] = g.Key; row["Amount 1"] = g.Sum(r => r.Field("Amount 1")); row["Amount 2"] = g.Sum(r => r.Field("Amount 2")); row["Amount 3"] = g.Sum(r => r.Field("Amount 3")); return row; }).CopyToDataTable(); 

你正在使你的电话无序。 下面的代码不会将数据放入表中,但它会为您提供可以轻松放入表中的数据。

 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)}); 

这对我有用。 如果您有十进制值并使用数据表作为数据表而不是变量,请稍微更改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("Amount 2")); //row["Amount 3"] = g.Sum(r => r.Field("Amount 3")); return row; }).CopyToDataTable();