如何用LINQ过滤对象中各Company/Division组的最新记录
问题描述
我有一个反序列化后的JSON对象,需要在处理前进行过滤。数据结构如下:
| Company | Division | LastModDate | 其他字段/对象 |
|---|---|---|---|
| 123 | 1 | 7/1/2021 | |
| 123 | 1 | 8/1/2022 | |
| 123 | 2 | 8/1/2022 |
需求是保留原对象的全部信息,移除每个Company/Division组中非最新的记录。
我已经尝试了以下代码,但不知道后续该如何操作:
var filtered = origObject.GroupBy(g=> new {g.Company,g.Division})
如果用SQL实现,我会使用row_number()函数并取第一条记录。
解决方案
你可以在分组后对每组内的记录按LastModDate降序排序,再取每组的第一条,这和SQL里用row_number()分区排序取第一条的逻辑完全对应,还能保留原对象的所有字段。
完整代码如下:
var filtered = origObject .GroupBy(g => new { g.Company, g.Division }) .Select(group => group.OrderByDescending(item => item.LastModDate).FirstOrDefault()) .Where(item => item != null) // 可选:过滤空分组,根据实际数据情况决定是否保留 .ToList();
关键步骤说明
- 分组:用
GroupBy按Company和Division组合键分组,把同公司同部门的记录归为一组。 - 组内排序:每个组内按
LastModDate降序排列,确保最新的记录排在最前面。 - 取最新记录:用
FirstOrDefault()获取每组的第一条,也就是该组的最新记录。 - 空值过滤:
Where(item => item != null)是可选操作,避免原数据存在空分组时返回null值。
这样处理后,filtered集合里就只保留了每个Company/Division组的最新完整对象,所有原有的字段和嵌套对象都会被完整保留。
内容的提问来源于stack exchange,提问作者KeithL
相关产品推荐
相关产品推荐

