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

Linq to SQL:使用GroupBy()和Max()获取目标数据集

问题描述

现有一张数据表,表结构包含Status(状态)与Category(分类)字段,需求为:

  • 按Status分组,获取每组中Category为最大值的所有行
  • 特殊场景处理:
    • 当Status为'1'时,最大Category是2,需获取该Category对应的所有行
    • 当Status为'2'时,最大Category是null,需获取该分组下所有Category为null的行

此前尝试的Linq代码仅能得到每组的Status与对应最大Category值,无法获取完整行数据,代码如下:

var tableData = (from d in x.Data
                 group d by d.Status into grp
                 select new { Status = grp.Key, Category = grp.Max(d => d.Category) }).ToList();
正确Linq查询实现

方案一:查询语法嵌套

先分组计算每组的最大Category(自动处理全为null时返回null的场景),再关联原表筛选符合条件的行:

var result = from d in x.Data
             join groupMax in (
                 from item in x.Data
                 group item by item.Status into grp
                 select new {
                     Status = grp.Key,
                     MaxCategory = grp.Max(i => i.Category)
                 }
             ) on d.Status equals groupMax.Status
             where (groupMax.MaxCategory == null && d.Category == null) || d.Category == groupMax.MaxCategory
             select d;

方案二:链式方法语法

逻辑与方案一致,用链式写法更简洁:

// 先获取每组的Status和对应最大Category
var groupMaxValues = x.Data
    .GroupBy(d => d.Status)
    .Select(grp => new {
        Status = grp.Key,
        MaxCategory = grp.Max(d => d.Category)
    });

// 关联原表筛选目标行
var result = x.Data
    .Join(groupMaxValues,
          data => data.Status,
          max => max.Status,
          (data, max) => new { DataRow = data, TargetCategory = max.MaxCategory })
    .Where(pair => 
        (pair.TargetCategory == null && pair.DataRow.Category == null) 
        || pair.DataRow.Category == pair.TargetCategory)
    .Select(pair => pair.DataRow);

核心说明

  • 原代码的问题:仅返回了分组聚合后的元数据,未关联原表提取完整行记录
  • null值处理:当分组的最大Category为null时,自动筛选该分组下所有Category为null的行;否则筛选Category等于最大值的行
  • 若使用EF Core等ORM框架,该写法会被转换为高效的SQL查询,无需担心内存处理性能问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:03:03