使用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
相关产品推荐
相关产品推荐

