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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:15:03