如何查找PersonToolDto列表重复项并保留时间最新的条目
你之前仅按PersonId分组无法正确去重,是因为重复项的判定逻辑应该是同一个PersonId + 同一个ToolId才算同一条重复数据,仅按PersonId分组会把同一个人绑定不同工具的条目也分到同一组,不符合业务规则。
以下是两种LINQ实现方案:
常规实现(代码简洁,适合中小数据量)
var result = personToolListFromSomeSource // 合并两个数据源的列表 .Concat(personToolListFromAnotherSource) // 按 PersonId+ToolId 组合作为重复判定的分组键 .GroupBy(x => new { x.PersonId, x.ToolId }) // 每个分组内取CreatedAt最新的条目 .Select(g => g.OrderByDescending(item => item.CreatedAt).First()) // 转成List结构返回 .ToList();
高性能实现(无需排序,适合大数据量场景)
如果你的数据量很大,排序会带来额外性能开销,可以遍历分组一次直接找时间最新的条目:
var result = personToolListFromSomeSource .Concat(personToolListFromAnotherSource) .GroupBy(x => new { x.PersonId, x.ToolId }) .Select(g => { var latestItem = g.First(); foreach (var item in g) { if (item.CreatedAt > latestItem.CreatedAt) { latestItem = item; } } return latestItem; }) .ToList();
以上两种方案最终输出的result都是List<PersonToolDto>类型,完全符合要求。用你给出的示例数据运行的话,最终会得到3条数据,其中PersonId=1、ToolId=1的条目会保留2021-07-07的版本,其余条目不变。
内容的提问来源于stack exchange,提问作者codlix
相关产品推荐
相关产品推荐

