如何使用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
相关产品推荐
相关产品推荐

