C#将单个列表返回到嵌套的JSON API中



我有一个简单的列表,它从我的DB返回到我的MVC API,示例查询是

select school, class, pupil from area

有了它,我将添加到列表中

foreach (DataRow row in table.Rows)
{
    var area = new Area();
    area.school = row.ItemArray[0].ToString();
    area.class = row.ItemArray[1].ToString();
    area.pupil = row.ItemArray[2].ToString();
    returnedlist.Add(area);
}
 

此时API只返回列表

{
  "School": "",
  "Class": "",
  "Pupil": ""
},
{
  "School": "",
  "Class": "",
  "Pupil": ""
},

然而,理想情况下,我希望它像下面的一样嵌套返回

[
    {
        School: "Name",
        Class: [
            ClassName: '',
            Pupil: [
                    PupilName: ''},
                    PupilName: ''},
                    PupilName: '']
    },
    {
        School: "Name",
        Class: [
            ClassName: '',
            Pupil: [
                    PupilName: ''},
                    PupilName: ''},
                    PupilName: '']
    },

我可能已经把它宰了,但你明白了。

数据的类别再次是非常简单的

public class Area
{
    public string School { get; set; }
    public string Class { get; set; }
    public string Pupil { get; set; }
  
}

到目前为止,我已经尝试过在列表等中返回一个列表,但没有任何运气。

非常感谢您的帮助。

要获得预期结果,可以创建具有以下结构的类:

1-类

public class NewArea
{
    public string School { get; set; }
    public List<Class> Classes { get; set; }
}
public class Class
{
    public string Name { get; set; }
    public List<string> Pupils { get; set; }
}

2-首先,学校分组,对于每个分组项目,<按>班级进行分组:

List<NewArea> newAreas = returnedlist
    .GroupBy(x => x.School)
    .Select(x => new NewArea
    {
        School = x.Key,
        Classes = x.GroupBy(y => y.Class).Select(z => new Class
        {
            Name = z.Key,
            Pupils = z.Select(w => w.Pupil).ToList()
        }).ToList()
    }).ToList();

3-测试示例:

List<Area> returnedlist = new List<Area>
{
    new Area{School = "s1", Class="c1",Pupil="p1"},
    new Area{School = "s1", Class="c1",Pupil="p2"},
    new Area{School = "s1", Class="c2",Pupil="p1"},
    new Area{School = "s1", Class="c2",Pupil="p2"},
    new Area{School = "s2", Class="c1",Pupil="p1"},
};

结果

[
   {
      "School":"s1",
      "Classes":[
         {
            "Name":"c1",
            "Pupils":[
               "p1",
               "p2"
            ]
         },
         {
            "Name":"c2",
            "Pupils":[
               "p1",
               "p2"
            ]
         }
      ]
   },
   {
      "School":"s2",
      "Classes":[
         {
            "Name":"c1",
            "Pupils":[
               "p1"
            ]
         }
      ]
   }
]

命名空间:

using System.Linq;
using System.Collections.Generic;

最新更新