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

如何在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();

关键说明:

  1. 分组逻辑:必须按用户的唯一标识分组,确保同一用户的所有记录被归为一组,这样拼接的Types才属于该用户。
  2. 空值过滤:通过Where(item => !string.IsNullOrEmpty(item.Alerta))过滤掉空的Alerta值,避免拼接时出现多余的逗号。
  3. 其他字段取值:因为同一组内的用户其他字段(比如Name、DateOfBirth)都是重复的,所以直接取分组键的值即可,不需要额外处理。

内容的提问来源于stack exchange,提问作者Isaías Orozco Toledo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:11