LINQ分组后如何按ProjectNumber+SubProjectNumber降序排序并保留全列
如何在LINQ中对去重后的列表按复合键降序排序并保留原实体结构?
你遇到的问题核心是错误地再次使用了GroupBy——第二次分组后返回的是IGrouping<匿名类型, 你的实体类型>集合,而CreateHTMLTable需要的是单个实体对象的列表,自然无法兼容。
我们只需要在已完成去重的LINQ链末尾,直接添加按复合键降序排序的逻辑即可,不需要额外分组:
// 先完成去重,再直接按复合键降序排序 var ListForEmailTableDistinct = ListForEmailTable .GroupBy(o => new { o.ProjectNumber, o.SubProjectNumber, o.SubProjectName, o.ProjectType, o.ProjectManager, o.ErrorType }) .Select(o => o.FirstOrDefault()) // 按ProjectNumber + SubProjectNumber的组合降序排序 .OrderByDescending(x => new { x.ProjectNumber, x.SubProjectNumber }) .ToList();
为什么这样可行?
- 去重逻辑保持不变:通过
GroupBy+FirstOrDefault得到的是去重后的单个实体列表,完整保留了所有原属性 OrderByDescending直接作用于实体列表:传入的匿名类型new { x.ProjectNumber, x.SubProjectNumber }会作为排序依据,LINQ会先按ProjectNumber降序,再按SubProjectNumber降序- 最终返回的仍是原实体类型的列表,完全符合
CreateHTMLTable的参数要求
之后你可以直接将这个列表传入方法:
HTMLTableInString = CreateHTMLTable(ListForEmailTableDistinct, x => (x?.ProjectNumber, "Project number"), x => (x?.SubProjectNumber, "Sub-project number"), x => (x?.SubProjectName, "Sub-project name"), x => (x?.ProjectType, "Sub-project type"), x => (x?.ProjectManager, "Project manager"), x => (x?.ErrorType, "Error type") );
如果你的ProjectNumber或SubProjectNumber是字符串类型,排序会遵循字典序;如果是数值类型,则按数值大小排序。如果需要自定义排序规则,可以在OrderByDescending中添加对应的逻辑。
内容的提问来源于stack exchange,提问作者10101
相关产品推荐
相关产品推荐

