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
相关产品推荐
相关产品推荐

