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

