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

如何使用EF Core 8的LINQ实现按行号过滤的分区查询?

对应原SQL的EF Core 8 LINQ实现

你可以通过EF Core 8支持的窗口函数API,直接映射原MySQL查询的逻辑,以下是两种常见写法:

方法链写法

var queryResult = context.Machines
    // 为每条数据添加按日期分组、按插入时间降序的行号
    .Select(m => new
    {
        m.MachineId,
        m.TotalProduction,
        RowNumber = EF.Functions.RowNumber()
            .PartitionBy(EF.Functions.Date(m.InsertedAt)) // 对应SQL的PARTITION BY DATE(InsertedAt)
            .OrderByDescending(m.InsertedAt) // 对应SQL的ORDER BY InsertedAt DESC
    })
    // 过滤出每组的第一条数据(行号=1)
    .Where(item => item.RowNumber == 1)
    // 只保留需要的字段
    .Select(item => new
    {
        item.MachineId,
        item.TotalProduction
    })
    .ToList();

查询表达式写法

var queryResult = (from m in context.Machines
                  select new
                  {
                      m.MachineId,
                      m.TotalProduction,
                      RowNumber = EF.Functions.RowNumber()
                          .PartitionBy(EF.Functions.Date(m.InsertedAt))
                          .OrderByDescending(m.InsertedAt)
                  })
                 .Where(item => item.RowNumber == 1)
                 .Select(item => new
                 {
                     item.MachineId,
                     item.TotalProduction
                 })
                 .ToList();

关键说明

  • EF.Functions.Date(m.InsertedAt):对应MySQL的DATE(InsertedAt)函数,用于提取日期部分进行分组
  • EF.Functions.RowNumber().PartitionBy(...).OrderByDescending(...):对应SQL的ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ... DESC)窗口函数逻辑
  • 先添加行号再过滤,完全匹配原SQL的子查询+过滤逻辑,EF Core 8会将其正确翻译为等价的MySQL语句

内容的提问来源于stack exchange,提问作者Guilherme Santana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:53:23