使用EF Core实现分组后获取每组最后一条记录的问题求助
你遇到的报错核心原因有两点:一是GroupBy后的筛选逻辑错误,你需要取每组最大的LocationModelId对应的记录,而非UserModelId;二是原有写法的GroupBy用法不符合EF Core的LINQ转SQL规则,无法被翻译为有效SQL。
以下是两种可正常翻译执行的实现方案:
方案1:兼容所有EF Core版本(对应你写的第一段IN子查询SQL)
该方案直接生成你验证过的子查询SQL,性能稳定,兼容全版本EF Core:
var locationDetails = _context.Location .Where(x => _context.Location .GroupBy(p => p.UserModelId) .Select(g => g.Max(l => l.LocationModelId)) .Contains(x.LocationModelId)) .OrderBy(p => p.DateCreated) .ToList();
方案2:简洁写法(EF Core 6及以上版本支持)
该写法更直观,EF Core 6+可直接翻译为高效SQL,无需客户端计算:
var locationDetails = _context.Location .GroupBy(p => p.UserModelId) // 每组按主键倒序排列,取第一条就是该组ID最大的最新记录 .Select(g => g.OrderByDescending(l => l.LocationModelId).FirstOrDefault()) .OrderBy(p => p.DateCreated) .ToList();
注意:不要为了规避报错直接加AsEnumerable/ToList把计算放到客户端,数据量大时会出现严重性能问题。
内容的提问来源于stack exchange,提问作者Glyn
相关产品推荐
相关产品推荐

