如何用F# query工作流实现按组取最大值对应行的查询
实现代码
首先假设你已经定义了对应表的实体类型,且YourDbContext中已声明对应DbSet<YourEntity>属性YourTable,以下代码可直接生成你给出的目标SQL结构:
let getMaxRevRows (dbContext: YourDbContext) = // 构造分组取最大rev的子查询 let maxRevSubQuery = query { for row in dbContext.YourTable do groupBy row.id into idGroup select (idGroup.Key, idGroup.Max(fun r -> r.rev)) } // 子查询和原表inner join取完整行数据 query { for a in dbContext.YourTable do join (groupId, maxRev) in maxRevSubQuery on (a.id = groupId && a.rev = maxRev) // 如需返回完整实体直接改为 select a 即可 select (a.id, a.rev, a.contents) } |> fun res -> res.ToList()
注意事项
- 以上写法生成的SQL和你提供的目标逻辑完全一致,兼容EF Core 3.11 + MS SQL的技术栈,无额外性能损耗
- 如果实体属性名和数据库字段有自定义映射,无需修改查询代码,EF Core会自动处理映射关系
- 如果需要返回完整实体对象,只需将
select后的元组替换为a即可
内容的提问来源于stack exchange,提问作者LA.27
相关产品推荐
相关产品推荐

