如何使用LINQ对多个字段进行GroupBy和排序



我有一个数据表(dresult)与4个字段,id,存储,sku和数量。不幸的是,有很多重复的数据表,我想删除(qtys是不同的,但其他字段是相同的)。

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

理想情况下,我想用查询结果覆盖现有的数据表,数量可以为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();

最新更新