如何使用 LINQ 按多个字段分组和排序

How to GroupBy and Order by multiple fields with LINQ

我有一个包含 4 个字段的数据表 (dtResult),id、store、sku 和 qty。不幸的是,我要删除的 DataTable 中有很多重复项(数量不同,但其他字段相同)。

我想按 id asc、store asc、sku asc 对 DataTable 进行排序,并按 id、store 和 sku 进行分组,这样我就有了一个唯一记录列表。

理想情况下,我想用查询结果覆盖现有的 DataTable,并且所有内容的数量都可以为 0。我有排序,目前我正在将它放入一个新的数据表中:

var dtUniqueResults = dtResult.AsEnumerable()
    .OrderBy(r => r.Field<string>("id"))
    .ThenBy(r => r.Field<string>("store"))
    .ThenBy(r => r.Field<string>("sku"))
    .CopyToDataTable();

我不明白如何使用 LINQ 进行分组。我想我需要添加这样的东西,但它不起作用。

var dtUniqueResults = dtResult.AsEnumerable()
    .GroupBy(n => n.Field<string>("id"),
             n => n.Field<string>("store"),
             n => n.Field<string>("sku")
    )
    .OrderBy(r => r.Field<string>("id"))
    .ThenBy(r => r.Field<string>("store"))
    .ThenBy(r => r.Field<string>("sku"))
    .CopyToDataTable();

我阅读了很多帖子,并且看到了几种实现方法。不过推荐最多的好像是这两个,但是看起来差别太大了,反而让我更加迷惑了。

GroupBy( x => new { x.Column1, x.Column2 })

AND

GroupBy(x=> new { x.Column1, x.Column2 }, (key, group) => new 
{ 
  Key1 = key.Column1,
  Key2 = key.Column2,
  Result = group.ToList() 
});

如果您需要过滤掉重复项,请尝试以下查询:

var dtUniqueResults = dtResult.AsEnumerable()
    .GroupBy(n => new 
        { 
            Id = n.Field<string>("id"),
            Store = n.Field<string>("store"),
            Sku = n.Field<string>("sku")
        }
    )
    .SelectMany(g => g.Take(1)) // get from group only one record
    .CopyToDataTable();