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

EF Core 7分组查询问题:如何获取每组最大值对应记录

EF Core 7 分组取最大batch_dt记录的改写方案

方案一:使用窗口函数(推荐,性能最优)

利用EF Core 7支持的ROW_NUMBER()窗口函数,直接在数据库层面完成分组排序和筛选,是效率最高的实现方式:

var lastLogs = _context.Db.data_point_logs
    .Select(l => new 
    {
        l.log_type,
        l.batch_dt,
        // 按log_type分组,每组内按batch_dt降序编号
        RowNum = EF.Functions.RowNumber()
            .Over(partitionBy: l.log_type, orderBy: l.batch_dt descending)
    })
    // 取每组编号为1的记录(即batch_dt最大的那条)
    .Where(x => x.RowNum == 1)
    .Select(x => new { x.log_type, x.batch_dt })
    .ToList();

方案二:子查询关联

先通过分组获取每个log_type对应的最大batch_dt,再通过关联匹配到原表中的对应记录:

// 先查询每个log_type的最大batch_dt
var maxBatchDtPerType = _context.Db.data_point_logs
    .GroupBy(l => l.log_type)
    .Select(grp => new 
    {
        log_type = grp.Key,
        maxBatchDt = grp.Max(l => l.batch_dt)
    });

// 关联原表筛选目标记录
var lastLogs = from l in _context.Db.data_point_logs
               join maxDt in maxBatchDtPerType 
                   on new { l.log_type, l.batch_dt } equals new { maxDt.log_type, maxDt.maxBatchDt }
               select new { l.log_type, l.batch_dt };

方案三:分组后直接过滤

调整原查询的结构,将过滤逻辑嵌入分组后的SelectMany操作中,让EF Core 7能正确翻译:

var lastLogs = _context.Db.data_point_logs
    .GroupBy(l => l.log_type)
    .SelectMany(grp => 
        // 直接在分组内筛选batch_dt等于组内最大值的记录
        grp.Where(l => l.batch_dt == grp.Max(g => g.batch_dt))
           .Select(l => new { l.log_type, l.batch_dt })
    );

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:42:21