如何在LINQ中对DataTable使用GroupBy实现指定聚合操作?
解决DataTable分组后去重计数错误的问题
首先看你的问题:你要按Column3和Column4分组,计算Column1的总和、Column2的去重计数,但当前代码里的g.Distinct().Count()是统计分组内唯一DataRow的数量,而不是Column2字段的去重值数量,这就是结果错误的根源。
修正后的代码实现
var queryDGroup = dtsecscaleditemsCloned2.AsEnumerable() .GroupBy(r => new { Column3 = r["Column3"], Column4 = r["Column4"] }); foreach (var g in queryDGroup) { DataRow addedRow = dtsecscaleditemsCloned.Rows.Add(); // 计算Column1的总和(根据实际数据类型调整转换,比如int/decimal等) addedRow["Column1"] = g.Sum(r => Convert.ToDecimal(r["Column1"])); // 计算Column2的去重计数:先提取Column2的值,再去重统计 addedRow["Column2"] = g.Select(r => r["Column2"]).Distinct().Count(); // 赋值分组的Column3和Column4值 addedRow["Column3"] = g.Key.Column3; addedRow["Column4"] = g.Key.Column4; }
关键说明
- Column1总和:使用
Sum()方法时,要将DataRow中的值转换为对应的数值类型(比如decimal适合高精度数值,int适合整数),避免类型转换异常。 - Column2去重计数:先通过
Select(r => r["Column2"])提取分组内所有Column2的值,再用Distinct()去重,最后用Count()统计数量,这才是你需要的“Column2的去重计数”逻辑。 - 分组键优化:分组时将匿名类的属性名和字段名保持一致(比如
Column3 = r["Column3"]),后续读取g.Key.Column3会更直观,减少混淆。
内容的提问来源于stack exchange,提问作者Mohamed Saeed
相关产品推荐
相关产品推荐

