EF Core中如何获取指定SheetId的最新版本表单数据?
在EF Core中实现获取指定表单最新版本数据的方案
对应你给出的SQL逻辑,在EF Core中有多种实用的实现方式,以下是几种常用方案:
1. 与原SQL逻辑完全匹配的子查询写法
这种写法会让EF Core生成和你提供的SQL近乎一致的查询语句,逻辑完全对齐:
int targetSheetId = 10; var latestSheet = await _context.Sheets .Where(s => s.SheetId == targetSheetId && s.Version == _context.Sheets .Where(s2 => s2.SheetId == targetSheetId) .Max(s2 => s2.Version)) .Select(s => new { s.Id, s.SheetId, s.Version, s.Title, s.CreatedTime }) .FirstOrDefaultAsync();
2. 排序取首条的简洁写法
如果仅需查询单个表单的最新版本,这种写法更直观简洁,EF Core会自动优化查询逻辑,性能和子查询方式相当:
int targetSheetId = 10; var latestSheet = await _context.Sheets .Where(s => s.SheetId == targetSheetId) .OrderByDescending(s => s.Version) .Select(s => new { s.Id, s.SheetId, s.Version, s.Title, s.CreatedTime }) .FirstOrDefaultAsync();
3. 批量获取多表单最新版本的窗口函数写法
如果需要一次性获取多个表单的最新版本,可以使用EF Core 3.0+支持的窗口函数,避免多次查询:
var latestSheets = await _context.Sheets .Select(s => new { s.Id, s.SheetId, s.Version, s.Title, s.CreatedTime, RowNumber = EF.Functions.RowNumber() .Over(partitionBy: s.SheetId, orderBy: s.Version descending) }) .Where(x => x.RowNumber == 1) .Select(x => new { x.Id, x.SheetId, x.Version, x.Title, x.CreatedTime }) .ToListAsync();
补充说明
- 方案1、2适合单表单查询场景,按需选择即可;
- 方案3针对批量场景,效率更高;
- 所有写法都会生成数据库端执行的SQL,不会在客户端做内存过滤。
内容的提问来源于stack exchange,提问作者MB_18
相关产品推荐
相关产品推荐

