c# - LINQ 查询输出 JSON 中的组和子组

标签 c# asp.net json linq entity-framework

我有一个像这样的表格(组):

ID       Name           ParentID
1        Group 1        null
2        Group 2        null
3        SubGr 1-1      1
4        SubGr 1-2      1
5        SubGr 2-1      2
6        Group 3        null
7        SubGr 1-2-1    4
..... and so on

我想将其序列化为 JSON,如下所示:

[{"id":1,
  "name":"Group 1",
  "children": [
    {
     "id":3,
     "name":"SubGr 1-1",
     "children":null
    },{
     "id":4,
     "name":"SubGr 1-2",
     "children": [
       {
        "id":7,
        "name":"SubGr 1-2-1", 
        "children": null
       }
      ]
    }
   ]
  },
 {"id":2,
  "name":"Group 2",
  "children": [
    {
     "id":5,
     "name":"SubGr 2-1",
     "children":null
    }
   ]
 },
 {"id":6,
  "name": "Group 3",
  "children": null
 }
]

如您所见,您可以拥有无​​限的子组。

如何在 LINQ 中进行此类查询并以 JSON 格式输出(如上面的示例所示)?

我可以将 JSON 输出为带有 ParentID 的单独元素,但我需要具有如上所述的结构。

这是我当前正在使用的代码,在尝试了不同的事情之后,但仍然没有运气(这个版本只提供了两个级别):

    public ActionResult GetGroups()
    {
        var groupobjs = db.GroupObjs.ToList();

        var items = groupobjs.Where(p => p.ParentID == null).Select(p => new
        {
            id = p.ID,
            name = p.Name,
            children = groupobjs.Where(c => c.ParentID == p.ID).Select(c => new {
                id = c.ID,
                name = c.Name
            })
        });



        return Json(items, JsonRequestBehavior.AllowGet);
    }      

最佳答案

我正在编写一些类似于 @Hunter-974 推荐的代码。

public class Group
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public List<Group> Subgroups { get; set; }

    public Group()
    {
        this.Subgroups = new List<Group>();
    }
}

class Program
{
    static void Main()
    {
        Group[] groups = new Group[]
        {
            new Group { Id = 1, Name = "Group 1", ParentId = null },
            new Group { Id = 2, Name = "Group 2", ParentId = null },
            new Group { Id = 3, Name = "SubGr 1-1", ParentId = 1 },
            new Group { Id = 4, Name = "SubGr 1-2", ParentId = 1 },
            new Group { Id = 5, Name = "SubGr 2-1", ParentId = 2 },
            new Group { Id = 6, Name = "Group 3", ParentId = null },
            new Group { Id = 7, Name = "SubGr 1-2-1", ParentId = 4 }
        };

        foreach (Group g in groups)
            if (g.ParentId.HasValue)
                groups.Single(group => group.Id == g.ParentId.Value).Subgroups.Add(g);

        var rootgroups = groups.Where(g => g.ParentId == null);

        JavaScriptSerializer js = new JavaScriptSerializer();
        Console.WriteLine(js.Serialize(rootgroups));
    }
}

关于c# - LINQ 查询输出 JSON 中的组和子组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602952/

相关文章:

c# - 搜索属性名称包含连字符/破折号的 XElement

c# - 如何绑定(bind)中继器 ItemDataBound,以在下拉列表 SelectedIndexChanged 上更新

Javascript 和 json 解析循环与外部文件

c# - 富域模型实现

c# - AddOutParameter - 查找 DBType.Int32 长度的非魔数(Magic Number)方式

javascript - 限制日期选择器日期

c# - 必须声明标量变量 "@.."gridview

json - 如何使用 jmsserialize 对 json 强制执行 bool 类型检查

javascript - 在 AngularJS 中将 json & 转换为 &

c# - 如何将用户提供的输入添加到 SQL 语句?