如何用单条LINQ查询获取每个Id对应的最近日期?
问题描述
现有如下数据表格:
| Id | Date |
|---|---|
| 1 | 30/07/2022 |
| 1 | 29/07/2022 |
| 1 | 28/07/2022 |
| 2 | 15/07/2022 |
| 3 | 15/07/2022 |
| 3 | 14/07/2022 |
需要编写单条无循环的LINQ查询,得到每个Id对应的最近日期,结果如下:
| Id | Date |
|---|---|
| 1 | 30/07/2022 |
| 2 | 15/07/2022 |
| 3 | 15/07/2022 |
用SQL实现这个需求很简单,但找不到理想的LINQ实现方式。
解决方案
要实现“按Id分组并取每组最新日期”的需求,有两种高效的LINQ写法,均为单条查询且无循环:
1. 分组后筛选每组最新记录
这是最直观的写法:先按Id分组,再对每组内的记录按日期降序排列,取第一条(即最新日期的记录)。
// 假设数据实体为Record,包含int Id和DateTime Date属性 var latestRecords = records .GroupBy(record => record.Id) .Select(group => group.OrderByDescending(r => r.Date).First());
如果你的Date字段是字符串类型,需要先转换为DateTime再排序,避免字符串排序逻辑错误:
var latestRecords = records .GroupBy(record => record.Id) .Select(group => group .OrderByDescending(r => DateTime.ParseExact(r.Date, "dd/MM/yyyy", CultureInfo.InvariantCulture)) .First());
2. 先聚合最大日期再关联原数据
这种写法更贴近SQL中GROUP BY + MAX的逻辑:先计算每个Id对应的最大日期,再通过关联筛选出原表中匹配的记录。
var idMaxDateMap = records .GroupBy(r => r.Id) .Select(g => new { Id = g.Key, MaxDate = g.Max(r => r.Date) }); var latestRecords = records .Join(idMaxDateMap, record => new { record.Id, record.Date }, map => new { map.Id, map.MaxDate }, (record, _) => record);
两种写法都能满足需求,第一种代码更简洁,第二种在处理大数据量时性能可能更优(取决于LINQ提供者的查询优化)。
内容的提问来源于stack exchange,提问作者G.Dealmeida
相关产品推荐
相关产品推荐

