【问题标题】:Linq recursive parent childLinq递归父子
【发布时间】:2018-03-21 17:09:01
【问题描述】:

我有这样的数据库数据:

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

我得到了解决方案:Recursive LINQ query: select item and all children with subchildren

但不幸的是,结果只有两个级别,因为我想要多级 > 2 级的结果(如树)。

还有其他最佳解决方案吗?或如何修改该解决方案

提前致谢

【问题讨论】:

  • whatever?这是一个完全合法的问题,因为您可以在数据库和列表上使用 LINQ。
  • 不是随便。 linq 的递归解决方案不适用于 linq-to-sql 或 linq-to-entities。
  • Linq 没有这个支持。为此,您需要编写一个递归函数调用。 Link 将支持您希望定义的层数
  • 哦,好吧,对不起。我的意思是 linq 到对象
  • @Nico 是的,它需要编写一个递归函数。如上所述,我得到了解决方案,但结果只有两个级别,我需要结果有多个级别

标签: c# linq recursion


【解决方案1】:

对于 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();

【讨论】:

  • 很高兴能帮上忙。
  • 向子节点添加分隔符的方法?
  • @Pablogrind 不确定您所说的“分隔符”是什么意思?
  • @Magnus 嗨,像 Record 1 - Record 2 -- Record 4 一样,在文本列中添加“-”以在选择中显示子项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2017-11-06
  • 2014-05-19
相关资源
最近更新 更多