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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:05:29