You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条LINQ查询获取每个Id对应的最近日期?

问题描述

现有如下数据表格:

IdDate
130/07/2022
129/07/2022
128/07/2022
215/07/2022
315/07/2022
314/07/2022

需要编写单条无循环的LINQ查询,得到每个Id对应的最近日期,结果如下:

IdDate
130/07/2022
215/07/2022
315/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:36:39