Linq递归父子关系

11

我有来自数据库的数据,类似于这样:

id | description              | parent_id
-----------------------------------------
1  | Record 1                 | null
2  | Record 2                 | 1
3  | Record 3                 | null
4  | Record 4                 | 2
5  | Record 5                 | 3

我希望使用 Linq 进行处理,且结果应该像这样:

Record 1
- Record 2
  - Record 4
Record 3
- Record 5

我找到了解决方案:递归LINQ查询:选择项目和所有子级及其子级

但不幸的是,该结果只有两级,因为我希望结果具有多级(就像一棵树一样)。

还有其他更好的解决方案吗?或者如何修改那个解决方案?

提前致谢


5
whatever?”这是一个完全合理的问题,因为您可以在数据库和列表上使用LINQ。 - user4189129
5
不是“任何东西”。针对 LINQ 的递归解决方案在 LINQ to SQL 或 LINQ to Entities 中不起作用。 - Magnus
Linq不支持此功能。您需要编写递归函数调用来实现。Link将支持您定义的任意层数。 - Nico
哦,好的,抱歉。我的意思是对象的LINQ。 - FirmanHidayat
@Nico 是的,需要编写一个递归函数。如上所述,我已经得到了解决方案,但结果只有两个级别,我需要结果具有多个级别。 - FirmanHidayat
1个回答

18

对于linq-to-objects,您可以在IEnumerable<T>上定义自己的扩展方法,递归获取所有子元素。

public static class EnumerableExtensions
{
    public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
    {
        foreach (var parent in source)
        {
            yield return parent;

            var children = selector(parent);
            foreach (var child in SelectRecursive(children, selector))
                yield return child;
        }
    }
}

使用方法:

var lookup = col.ToLookup(x => x.Parent_Id);
var res = lookup[null].SelectRecursive(x => lookup[x.Id]).ToList();

2
我很高兴能够帮忙。 - Magnus
有没有一些方法可以为子节点添加分隔符? - Pablogrind
@Pablogrind 不确定您所说的“分隔符”是什么意思? - Magnus
@Magnus 你好,想要实现以下效果:
  • Record 1
  • Record 2 -- Record 4 请在文本列中添加“-”以显示子级。
- Pablogrind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接