如何在C#中对重复的SQL查询结果进行分组?
解决SQL Server重复结果分组合并及空值处理问题
看起来你需要把同一用户的多条重复记录(仅Alerta字段不同)合并为单条,并将多个Alerta值拼接成列表,同时避免空值带来的多余逗号。我分两种方案来帮你解决:
方案一:在数据库存储过程层面处理(推荐,效率更高)
如果可以修改存储过程,直接用SQL Server的STRING_AGG函数完成分组拼接,同时过滤空值,这样返回的结果就是已经合并好的单条记录,不需要在代码里再处理:
-- 修改存储过程中的查询逻辑,按用户唯一信息分组 SELECT Name, DateOfBirth, Type, -- 过滤掉NULL或空字符串的Alerta,再用逗号分隔拼接 STRING_AGG(CASE WHEN Alerta IS NOT NULL AND Alerta <> '' THEN Alerta END, ', ') WITHIN GROUP (ORDER BY Alerta) AS Types FROM 你的数据源表 -- 按用户的唯一标识分组,确保同一用户的记录被合并 GROUP BY Name, DateOfBirth, Type /* 其他用户固定字段 */
这样存储过程返回的Types字段就是已经合并好的非空值列表,不会有多余逗号。
方案二:在C#代码层面处理
如果不能修改存储过程,就需要在EF Core返回结果后,通过分组和过滤来处理:
你之前的代码没有按用户分组,导致把所有用户的Alerta都混在一起拼接了,而且没过滤空值,才会出现多余逗号。修改后的代码如下:
var getUsuarios = _context .LoadStoredProc("General.GetUsuarios_Personal") .ExecuteStoredProc<GetPersonalDTO>(); // 按用户的唯一标识分组(优先用UserId这类主键,没有的话用Name+DateOfBirth组合) var mergedUsuarios = getUsuarios .GroupBy(u => new { u.Name, u.DateOfBirth, u.Type /* 其他用户固定字段 */ }) .Select(group => new { Name = group.Key.Name, DateOfBirth = group.Key.DateOfBirth, Type = group.Key.Type, // 过滤掉空值或null的Alerta,再拼接 Types = string.Join(", ", group.Where(item => !string.IsNullOrEmpty(item.Alerta)).Select(item => item.Alerta)) }) .ToList();
关键说明:
- 分组逻辑:必须按用户的唯一标识分组,确保同一用户的所有记录被归为一组,这样拼接的
Types才属于该用户。 - 空值过滤:通过
Where(item => !string.IsNullOrEmpty(item.Alerta))过滤掉空的Alerta值,避免拼接时出现多余的逗号。 - 其他字段取值:因为同一组内的用户其他字段(比如
Name、DateOfBirth)都是重复的,所以直接取分组键的值即可,不需要额外处理。
内容的提问来源于stack exchange,提问作者Isaías Orozco Toledo
相关产品推荐
相关产品推荐

