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
相关产品推荐
相关产品推荐

