使用linq按父级对对象列表进行分组以输出子元素

时间:2014-06-27 10:55:53

标签: c# linq

我对linq小组有一个愚蠢的问题,因为我不能独自工作。

基本上我有一个项目列表,我试图通过其parentId组合在一起详细信息

var list = new List<GroupItem>()
{
    new GroupItem() {Id = 1, Name = ".net"},
    new GroupItem() {Id = 2, Name = "asp.net", ParentId = 1},
    new GroupItem(){Id = 3,Name = "c#",ParentId = 1},
    new GroupItem(){Id = 4,Name = "php"},
    new GroupItem(){Id = 5,Name = "zend",ParentId = 4}
};

var group = from g in list
            group g by g.ParentId ==null
                into grouped
            select new
            {
                FrameworkId = grouped.Key,
                Items = (from g in list
                        where g.ParentId==g.ParentId
                        select g).ToList()

            };

foreach (var gi in group)
{

    Console.WriteLine(gi.FrameworkId);
    foreach (var item in gi.Items)
    {
        Console.WriteLine(item.Name);
    }
}

我做错了什么?

3 个答案:

答案 0 :(得分:2)

你的查询似乎太复杂了:

  1. 您应该按ParentId分组,使其不为空
  2. 的项目
  3. 您不需要通过匹配ParentId再次找到这些项目,因为GroupBy运营商会为您执行此操作
  4. 我的首选解决方案:

    list.Where(x => x.ParentId != null)
        .GroupBy(x => x.ParentId, 
                 (key, elements) => 
                    new {
                      FrameworkId = key,
                      Items = elements.ToList()
                    })
        .ToList();
    

答案 1 :(得分:0)

您可以直接使用此查询过滤数据。

如果您想要没有ParentID的数据,那么您可以使用下面提到的查询

 var gr = list.Where(p => p.ParentId == 0).ToList();

如果您想要拥有Parent Id的数据,那么您可以使用下面提到的代码

 var gr1 = list.Where(p => p.ParentId != 0).ToList();

答案 2 :(得分:0)

这是我的解决方案:

 list.Where(x => x.ParentId != null)
  .GroupBy(x => x.ParentId)
  .Select(x => new ParentViewModel {
     ParentId = x.Key.ParentId,
     Parent = x.ToList()
  })
  .ToList();

现在,您将在ParentViewModel的“父对象”中获得子项,例如Parent.Items