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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:52:13