2

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

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 格式输出?

使用 ParentID 将 JSON 输出为单独的元素没有问题,但我需要具有上述结构。

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

    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);
    }      
4

2 回答 2

2

我正在编写一些类似于@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));
    }
}
于 2012-09-26T14:50:04.387 回答
0

我认为您应该使用递归方法而不是 LINQ 来执行此操作。

1)定义一个代表组的类,具有属性ID(int),属性名称(字符串),属性Children(List),属性Parent(int?,未序列化)和方法Serialize()(谁为儿童中的每个组调用序列化)

2) 定义一个包含“根”组的列表,以及一个包含所有组的列表。

3) 对于数据表的每一行,创建一个对象组。定义它的所有属性。显然,孩子的名单将是空的。

4)对于每个Group,如果父ID不为null,则将其添加到他的父中。这样,您将填写所有组的子列表。

5)对于每个Group,如果父ID为null,则将该Group添加到Roots列表中。

6)对于Roots列表中的每个Group,调用方法Serialize。

我希望这能帮到您。问我是否需要更多解释或代码而不是它们。

于 2012-09-26T13:54:40.743 回答