从LINQ QUERY中删除分组依据

时间:2018-07-20 12:41:20

标签: c# .net linq datatable

我想从下面的代码中删除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

我想要的结果如下。

1 个答案:

答案 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();

是同一件事,不同之处在于我在下面链接的帖子。