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

基于Entity Framework获取userid/testid组最新结果的最优LINQ查询

高效获取每组userid/testid最新测试结果的EF LINQ方案

先明确你的核心需求:从测试结果表中,提取每个userid+testid组合下最新日期的那条记录。先把原始数据和期望结果整理出来更直观:

原始数据

useridtestiddateresult
1118-01-011
1118-01-096
1318-01-095
1318-01-102

期望结果

useridtestiddateresult
1118-01-096
1318-01-102

最优高效方案:使用EF窗口函数(RowNumber)

这是性能最好的实现方式——所有逻辑都在数据库端完成,EF会将其转换为带有ROW_NUMBER()窗口函数的SQL,只需一次表扫描就能完成分组、排序和筛选,完全避免客户端额外处理或N+1查询的性能问题。

假设你的实体类定义如下:

public class TestResult
{
    public int UserId { get; set; }
    public int TestId { get; set; }
    public DateTime Date { get; set; }
    public int Result { get; set; }
}

对应的LINQ查询代码(推荐异步版本):

using Microsoft.EntityFrameworkCore; // 确保引用EF Core相关命名空间

var latestTestResults = await _context.TestResults
    .Select(result => new 
    {
        result.UserId,
        result.TestId,
        result.Date,
        result.Result,
        // 按userid+testid分组,每组内按日期倒序生成行号
        RowNum = EF.Functions.RowNumber()
            .Over(PartitionBy(result => new { result.UserId, result.TestId })
            .OrderByDescending(result => result.Date))
    })
    // 筛选每组行号为1的记录(即最新的那条)
    .Where(anon => anon.RowNum == 1)
    // 映射回实体类或自定义DTO
    .Select(anon => new TestResult
    {
        UserId = anon.UserId,
        TestId = anon.TestId,
        Date = anon.Date,
        Result = anon.Result
    })
    .ToListAsync();

备选方案:子查询匹配最大日期(兼容EF6)

如果项目使用的是不支持窗口函数的EF6,可以用子查询的方式实现:

var latestTestResults = await _context.TestResults
    .Where(result => result.Date == _context.TestResults
        // 子查询获取当前userid+testid的最大日期
        .Where(r => r.UserId == result.UserId && r.TestId == result.TestId)
        .Max(r => r.Date))
    .ToListAsync();

⚠️ 注意:如果同一userid+testid组合下存在多条相同最新日期的记录,这个方案会返回所有符合条件的记录;而窗口函数方案可以通过添加额外排序字段(比如OrderByDescending(r => r.Date).ThenBy(r => r.Id))来保证每组只返回一条。


方案对比

方案性能适用场景特点
窗口函数(RowNumber)最优EF Core 2.1+、支持窗口函数的数据库一次表扫描,逻辑清晰,可控性强
子查询匹配最大日期良好EF6及更早版本写法简单,但存在重复日期时返回多条

内容的提问来源于stack exchange,提问作者Joey Erdogan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:12:28