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

使用LINQ筛选各操作类型最新记录的技术问题

按Operation分组并获取每个组最新Date记录的解决方案

嗨,我来帮你搞定这个需求!你需要从Item列表(不管是EF查询的数据库数据还是内存中的列表)里,按operation类型分组,然后每个组只保留date最新的那条记录对吧?这里有几种实用的方法:

方法1:分组后排序取第一条(直观易读)

这种方法逻辑很直接,先按operation分组,每个组内按date降序排列,取第一条就是最新的记录。需要注意的是如果你的date是字符串类型,要先转换成DateTime才能准确比较时间先后:

内存列表场景(对应你给出的示例数据)

using System.Globalization;

var result = list
    .GroupBy(item => item.operation)
    .Select(group => 
        group.OrderByDescending(item => DateTime.ParseExact(item.date, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture))
             .First()
    )
    .ToList();

EF数据库查询场景(如果数据库中date是DateTime类型)

如果你的数据库里date字段本身就是DateTime类型,不需要字符串解析,直接写:

var result = context.Items
    .GroupBy(item => item.operation)
    .Select(group => 
        group.OrderByDescending(item => item.date)
             .FirstOrDefault()
    )
    .ToList();

方法2:先获取每组最新日期再关联(性能更优)

如果数据量比较大,这种方法会更高效——先找出每个operation对应的最新日期,再通过关联匹配到对应的完整记录:

using System.Globalization;

// 第一步:获取每个operation的最新日期
var latestDatePerOperation = list
    .GroupBy(item => item.operation)
    .Select(group => new 
    {
        Operation = group.Key,
        LatestDate = group.Max(item => DateTime.ParseExact(item.date, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture))
    });

// 第二步:关联原列表,筛选出匹配的记录
var result = list
    .Join(
        latestDatePerOperation,
        item => new { 
            item.operation, 
            Date = DateTime.ParseExact(item.date, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture) 
        },
        ld => new { ld.Operation, ld.LatestDate },
        (item, ld) => item
    )
    .ToList();

额外提醒

如果你的数据库中date字段现在是字符串类型,强烈建议改成DateTime类型,这样不仅能避免字符串解析的麻烦,还能保证时间比较的准确性,同时数据库层面的查询性能也会更好。

内容的提问来源于stack exchange,提问作者SunAwtCanvas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:48:18