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

C# Web API如何将同一学生的多行数据合并为单个返回对象

解决方案:合并同一学生的多部门记录

方法一:SQL层面合并(推荐)

直接在数据库查询阶段完成合并,效率更高,无需在代码中额外处理。SQL Server 2017及以上版本支持STRING_AGG函数,可将同一学生的部门字段拼接为字符串:

SELECT 
    'STUDENT' AS Role,
    'UG' AS Level,
    2 AS Year,
    STRING_AGG(Department, ', ') AS Departments,
    Name,
    StudentId
FROM YourStudentTable
WHERE StudentId = @TargetStudentId
GROUP BY Role, Level, Year, Name, StudentId

查询结果会直接返回单条记录,后续只需将合并后的部门字符串拆分为数组元素,即可匹配你期望的返回格式。

方法二:C#代码层面合并

如果无法修改SQL查询,可通过Linq分组实现数据合并:

1. 定义学生记录模型(若未定义)

public class StudentRecord
{
    public string Role { get; set; }
    public string Level { get; set; }
    public int Year { get; set; }
    public string Department { get; set; }
    public string Name { get; set; }
    public int StudentId { get; set; }
}

2. 分组合并逻辑

// 按学号分组,聚合同一学生的所有部门
var mergedResult = studentList
    .GroupBy(stu => stu.StudentId)
    .Select(group => 
    {
        var baseRecord = group.First();
        // 提取该学生的所有部门(去重)
        var departments = group.Select(stu => stu.Department).Distinct().ToArray();
        
        // 组合成目标数组格式:[Role, Level, Year, 部门1, 部门2, Name, StudentId]
        var roleArray = new List<object>
        {
            baseRecord.Role,
            baseRecord.Level,
            baseRecord.Year
        };
        roleArray.AddRange(departments);
        roleArray.Add(baseRecord.Name);
        roleArray.Add(baseRecord.StudentId);
        
        return roleArray;
    })
    .ToList();

// 包装为最终返回结构
var response = new { roles = mergedResult };

原代码改进说明

你之前的代码仅获取了第一条记录,但未处理核心的部门合并逻辑。正确思路是先按学号分组,将同一学生的所有记录归为一组,再提取角色、年级等公共字段,最后把组内的所有部门字段合并到结果中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:45:44