基于A_VERSION最大值分组查询TB_USER_ROUTE的C# LINQ实现
获取每个FK_CODE_TYPE对应最大A_VERSION的所有记录
现有TB_USER_ROUTE表数据:
+------------+----------------------+--------------------+------------+-----------------+---------+ | ID | FK_CODE_TYPE | A_SEQ | A_IDNAME | A_NAMEFULL | A_VERSION| +------------+----------------------+--------------------+------------+-----------------+---------+ | 1 | 1 | 1 | A2 | 077-25000000 | 1 | | 2 | 1 | 2 | A3 | 075-12458969 | 1 | | 3 | 2 | 1 | A2 | 077-25000000 | 1 | | 4 | 4 | 1 | A2 | 077-25000000 | 1 | | 5 | 4 | 2 | A3 | 075-12458969 | 1 | | 6 | 1 | 1 | A2 | 077-25000000 | 2 | | 7 | 1 | 2 | A3 | 075-12458969 | 2 |
需要得到的目标结果:
+------------+----------------------+--------------------+------------+-----------------+---------+ | ID | FK_CODE_TYPE | A_SEQ | A_IDNAME | A_NAMEFULL | A_VERSION| +------------+----------------------+--------------------+------------+-----------------+---------+ | 6 | 1 | 1 | A2 | 077-25000000 | 2 | | 7 | 1 | 2 | A3 | 075-12458969 | 2 | | 3 | 2 | 1 | A2 | 077-25000000 | 1 | | 4 | 4 | 1 | A2 | 077-25000000 | 1 | | 5 | 4 | 2 | A3 | 075-12458969 | 1 |
需求说明:获取每个FK_CODE_TYPE对应的最大A_VERSION的所有记录,比如FK_CODE_TYPE=1有4条记录,仅保留A_VERSION=2的两条。
当前代码只能获取每组第一条记录:
var result = tblist.GroupBy(x => x.FK_CODE_TYPE, (key,g) => g.OrderBy(e => e.A_SEQ).First());
解决方案
修改后的LINQ查询如下:
var result = tblist .GroupBy(x => x.FK_CODE_TYPE) .SelectMany(g => { var maxVersion = g.Max(e => e.A_VERSION); return g.Where(e => e.A_VERSION == maxVersion).OrderBy(e => e.A_SEQ); }) .ToList();
代码解释
- GroupBy:按
FK_CODE_TYPE分组,将同类型的记录归为一组。 - SelectMany:展开每组的结果,确保返回每组内的多条符合条件的记录,而非单条。
- Max(e => e.A_VERSION):计算当前分组内的最大版本号。
- Where(e => e.A_VERSION == maxVersion):筛选出分组内版本号等于最大值的所有记录。
- OrderBy(e => e.A_SEQ):按
A_SEQ排序,保证结果顺序与目标一致。
内容的提问来源于stack exchange,提问作者BlackSD
相关产品推荐
相关产品推荐

