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

EF Core如何简化获取分组内最新记录的Linq查询?

简化EF Core获取分组最新记录的查询方式

针对你的需求(获取所有Name为Bob且Iteration值最大的记录),可以用更简洁的方式实现,避免生成复杂的分组关联SQL:

方式一:分步查询(可读性高)

先获取Bob的最大Iteration值,再筛选对应记录:

// 获取Bob的最大Iteration值
var maxBobIteration = context.Persons
    .Where(p => p.Name == "Bob")
    .Max(p => p.Iteration);

// 查询所有符合条件的记录
var latestBobRecords = context.Persons
    .Where(p => p.Name == "Bob" && p.Iteration == maxBobIteration)
    .ToList();

方式二:子查询一步完成

将逻辑合并为单个查询,生成的SQL会包含子查询,但比原分组写法更简洁:

var latestBobRecords = context.Persons
    .Where(p => 
        p.Name == "Bob" 
        && p.Iteration == context.Persons
            .Where(p2 => p2.Name == "Bob")
            .Max(p2 => p2.Iteration))
    .ToList();

原写法问题说明

你之前用GroupBy+OrderByDescending+FirstOrDefault的写法,EF Core会生成包含分组、排序、自关联的复杂SQL(多SELECT+JOIN)。而用Max定位最大Iteration的方式,逻辑更直接,生成的SQL结构简单,性能也更优。

另外需要注意:如果存在多条Bob记录且Iteration值同为最大值,原写法只会返回其中一条,而上面两种方式会返回所有符合条件的记录——如果你的需求确实只需要单条记录,可以在查询末尾追加FirstOrDefault()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:16:11