我想从下面的代码中删除GROUP BY子句。我该怎么做。
var newDt = dt.AsEnumerable()
.GroupBy(r => r.Field<string>("BATCH NUM"))
.Select(g =>
{
var row = dt.NewRow();
row["BATCH NUM"] = g.Key;
row["QTY"] = g.Sum(r => Convert.ToInt32(r.Field<string>("QTY")) + Convert.ToInt32(r.Field<string>("BONUS")));
row["PROD ID"] = String.Join(",", g.Select(x => x.Field<string>("PROD ID")).Distinct());
// row["PROD ID"] = g.Select(r => r.Field<string>("PROD ID"));
return row;
}).CopyToDataTable();
当我们有两个不同的“ PROD ID”但具有相同的“ BATCH NUM”时,这会产生问题,然后将“ PROD ID”组合到一个字段中,从而将相同批次的两个PROD ID都对待。 Here is a Image you can see
我想要的结果如下。
答案 0 :(得分:1)
如果尝试删除“分组依据”,则会导致错误,因为您在选择中进行了求和。删除时,“组”对象不再是TKey,TElement的集合。
如果您想对每个“ PROD ID”进行“数量”总和并收集“ BATCH NUM”,那是最好的方法。
还有另一种使用ToLookup的方法,但: lookup vs. groupby
评论中要求的详细信息:
通过查找,您可以执行相同的操作...
var newDt = dt.AsEnumerable()
.ToLookup(r => r.Field<string>("PROD ID"))
.Select(g =>
{
var row = dt.NewRow();
row["PROD ID"] = g.Key;
row["QTY"] = g.Sum(r => Convert.ToInt32(r.Field<string>("QTY")) + Convert.ToInt32(r.Field<string>("BONUS")));
row["BATCH NUM"] = String.Join(",", g.Select(x => x.Field<string>("BATCH NUM")));
return row;
}).CopyToDataTable();
是同一件事,不同之处在于我在下面链接的帖子。