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

C#子查询用MAX()遇重复结果,求OrderBy实现方案

解决EF查询中同一组多最大值记录重复的问题

你的原C#查询会返回所有满足「Deadline等于所在GroupRealizationId组内最大值」的记录,所以当同一组存在多条拥有相同最大Deadline的记录时,结果会重复。结合你给出的SQL(分组返回每个GroupRealizationId),这里提供两种针对性解决方案:

方案一:仅获取去重后的GroupRealizationId(与SQL逻辑一致)

直接在原查询基础上提取GroupRealizationId并去重:

var groupIds = _context.PerformanceRealization
    .Where(u => u.Deadline == _context.PerformanceRealization
        .Where(x => x.GroupRealizationId == u.GroupRealizationId)
        .Max(x => x.Deadline)
    )
    .Select(u => u.GroupRealizationId)
    .Distinct()
    .ToList();

方案二:获取每个组对应的单条PerformanceRealization实体

如果需要完整的实体数据,且每个GroupRealizationId仅保留一条记录,可以通过GroupBy结合OrderBy实现:先按GroupRealizationId分组,筛选出组内Deadline等于最大值的记录,再通过OrderBy指定排序规则(比如按Id),最后取每组第一条:

var pr = _context.PerformanceRealization
    .GroupBy(u => u.GroupRealizationId)
    .Select(g => g
        .Where(u => u.Deadline == g.Max(x => x.Deadline))
        .OrderBy(u => u.Id) // 可替换为业务需要的排序字段,确保取固定的一条
        .FirstOrDefault()
    )
    .Where(u => u != null) // 过滤无有效记录的分组
    .AsQueryable();

另一种等价写法(先查询组内最大Deadline再关联)

// 先获取每个组的最大Deadline
var maxDeadlineGroups = _context.PerformanceRealization
    .GroupBy(u => u.GroupRealizationId)
    .Select(g => new {
        GroupId = g.Key,
        MaxDeadline = g.Max(x => x.Deadline)
    });

// 关联原表后分组取单条记录
var pr = _context.PerformanceRealization
    .Join(maxDeadlineGroups,
        prEntity => new { prEntity.GroupRealizationId, prEntity.Deadline },
        groupData => new { groupData.GroupId, groupData.MaxDeadline },
        (prEntity, groupData) => prEntity)
    .GroupBy(u => u.GroupRealizationId)
    .Select(g => g.OrderBy(u => u.Id).FirstOrDefault())
    .Where(u => u != null)
    .AsQueryable();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:03:17