C# Web API多部门学生数据合并为单元素的实现求助
多部门学生数据合并的C# Web API解决方案
需求回顾
- 提供GET接口,支持获取单个学生数据(
/campusCustomRoles/{id})或所有学生数据 - 单部门学生返回单个JSON元素,多部门学生需合并为单个元素,仅返回字段值(无键名),存在多值的字段用数组表示
代码优化与修改
1. 修正Roles与readRoles类
原代码中readRoles重复定义基类属性,属于冗余代码,修正后如下:
public class Roles { public int UserName { get; set; } public string PersonName { get; set; } public string Profile { get; set; } public string Level { get; set; } public int Year { get; set; } public string Department { get; set; } } public class readRoles : Roles { public readRoles(DataRow dataRow) { UserName = (int)dataRow["UserName"]; PersonName = (string)dataRow["PersonName"]; Profile = (string)dataRow["Profile"]; Level = (string)dataRow["Level"]; Year = Convert.ToInt32(dataRow["Year"]); Department = (dataRow["Department"] == DBNull.Value) ? "No Department" : dataRow["Department"].ToString(); } }
2. 修改Get(int id)方法的合并逻辑
替换原代码中仅支持2个部门合并的代码块,改为适配任意数量部门的逻辑:
public HttpResponseMessage Get(int id) { string connString = @"XXXXXXXXXX"; DataSet _ds = new DataSet(); using (SqlConnection con = new SqlConnection(connString)) { con.Open(); var sql = @"select distinct CONCAT(CONCAT(mytable.surname, ', '),dbo.initcap(mytable.forenames)) as 'PersonName' ,convert(int,mytable.studentID) as 'UserName' ,mytable.category as 'Profile' ,mytable.level as 'Level' ,mytable.year as 'Year' ,mytable.depat as 'Department' from MYTABLE WHERE convert(int,mytable.studentID) = @UserName order by 2 desc "; SqlDataAdapter _adapter = new SqlDataAdapter(sql, con); _adapter.SelectCommand.Parameters.AddWithValue("@UserName", id); _adapter.Fill(_ds, "roles"); // 读取所有学生数据到列表 List<List<object>> studentRoles = new List<List<object>>(); if (_ds.Tables[0].Rows.Count > 0) { foreach (DataRow drow in _ds.Tables[0].Rows) { var item = new List<object>(); item.Add((string)drow["Profile"]); item.Add((string)drow["Level"]); item.Add(Convert.ToInt32(drow["Year"])); item.Add((drow["Department"] == DBNull.Value) ? "No Department" : drow["Department"].ToString()); item.Add((string)drow["PersonName"]); item.Add((int)drow["UserName"]); studentRoles.Add(item); } } // 多部门数据合并逻辑 if (studentRoles.Count > 1) { // 构建合并后的单个元素 List<object> mergedItem = new List<object>(); // 遍历每个字段位置(Profile、Level、Year、Department、PersonName、UserName) for (int fieldIndex = 0; fieldIndex < studentRoles[0].Count; fieldIndex++) { // 收集当前字段的所有不同值 var distinctValues = studentRoles.Select(row => row[fieldIndex]) .Distinct() .ToList(); // 如果有多个不同值,用JArray包装;否则用单个值 if (distinctValues.Count > 1) { JArray valueArray = new JArray(); foreach (var val in distinctValues) { valueArray.Add(val); } mergedItem.Add(valueArray); } else { mergedItem.Add(distinctValues[0]); } } // 替换原列表为仅包含合并后的元素 studentRoles.Clear(); studentRoles.Add(mergedItem); } var response = Request.CreateResponse(HttpStatusCode.OK, new { roles = studentRoles }); return response; } }
关键逻辑说明
- 使用
using语句管理SqlConnection,确保连接自动释放 - 对每个字段位置,通过
Distinct()收集所有不同值,避免重复 - 若字段存在多值,用
JArray包装成数组;否则保留单个值 - 最终将合并后的单个元素替换原列表,保证返回格式符合外部企业要求
内容的提问来源于stack exchange,提问作者GBM
相关产品推荐
相关产品推荐

