如何使用Entity Framework查询每个姓名对应最新日期的原始行
解决方案
核心实现逻辑
不用聚合运算,直接按姓名分组后取每组内销售日期最大的原始行,Entity Framework 会自动翻译为 SQL Server 可高效执行的查询语句,无需手动编写原生 SQL,适合嵌套到复杂查询逻辑中使用。
实现代码
写法1(兼容性最高,EF6/EF Core 通用)
假设你的实体类为SalesRecord,对应上下文的 DbSet 为SalesRecords:
var queryResult = dbContext.SalesRecords // 按姓名分组 .GroupBy(sale => sale.Name) // 每组内按销售日期倒序,取第一条即最新数据 .Select(group => group.OrderByDescending(sale => sale.DateSold).FirstOrDefault()) .ToList();
写法2(EF Core 3.0+ 性能更可控)
直接调用 EF 内置函数映射 SQL Server 的ROW_NUMBER窗口函数,逻辑更贴近原生 SQL 执行逻辑:
var queryResult = dbContext.SalesRecords .Select(sale => new { SaleItem = sale, // 按姓名分区,销售日期倒序生成行号 RowNum = EF.Functions.RowNumber( EF.Functions.PartitionBy(sale.Name), EF.Functions.OrderByDescending(sale.DateSold)) }) // 取每个分区行号为1的即最新数据 .Where(item => item.RowNum == 1) .Select(item => item.SaleItem) .ToList();
注意事项
- 两种写法都会被 EF 翻译为服务端执行的 SQL,不会将全表数据拉取到客户端计算,性能与手写原生 SQL 一致
- 自动保留原始行的所有字段,无需手动映射字段
- 如果存在同一个姓名同一个最新销售日期对应多条数据的场景,可以在排序规则后追加主键等唯一字段排序,保证返回结果的确定性
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

