【问题标题】:Recursive Hierarchical Joins with Depth具有深度的递归分层连接
【发布时间】:2013-02-06 19:45:53
【问题描述】:

我按照Recursive Hierarchical Joins in C# and LINQ 的帖子实现了递归连接扩展,以在我的应用程序中显示树视图数据。由于我有 15000 个树节点,客户端准备的 jQuery DynaTree 在有问题的浏览器 I.E 7&8 中需要大量时间(50 秒)

为了避免这种情况,我决定一开始只加载一个关卡,然后按需加载其他子级(延迟加载)。

但我看不到在递归连接中设置深度的效果。即使我指定,它也会准备所有节点。

public static List<DynaTreeNode> GenerateTreeByDepth(List<NodeDTO> nodeList, 
   int deepLevel)
  {

  StringBuilder hirTree = new StringBuilder();
  List<DynaTreeNode> tree = new List<DynaTreeNode>();

  IEnumerable<DynaTreeNode> nodes = nodeList.RecursiveJoin
  (element => element.DataPointSK,element => element.DataPointSKParent,
  (NodeDTO element, int index, int depth,IEnumerable<DynaTreeNode> childNodes) => 
                new DynaTreeNode()
               {
                   title = element.DataPoint,
                   key = element.DataPointSK.ToString(),
                   children = childNodes.ToList(),
                   select = element.selected,
                   expand = element.selected,                      
                   Depth = deepLevel
               });
        tree = nodes.ToList();          
        return tree;

    }

我试过设置深度

深度 = deepLevel

但是没有用。可能是什么问题?我怎样才能做到这一点?

【问题讨论】:

    标签: c# jquery linq dynatree


    【解决方案1】:

    RecursiveJoin 扩展方法用于从原始节点构建树。 您使用的重载传递了 int depth 参数,以初始化新创建的节点及其所在的级别,并且与构建的树的深度无关。

    扩展本身是惰性的。当您第一次调用 RecursiveJoin 时,它将返回根的 IEnumerable,在您开始枚举之前不会具体化。

    您的代码的问题是您急切地将 IEnumerable 的子级转换为列表:

    children = childNodes.ToList()

    这会强制子集合的具体化,再次递归调用相同的方法来构造 DynaTreeNode,并在所有级别重复。尝试用 IEnumerable 替换 DynaTreeNode 中的子列表 - 这将按需生成 DynaTreeNode。

    或者您可以保留列表,并将上面的行替换为以下代码:

    儿童 = 深度 >= 深度? null : childNodes.ToList()

    正如预期的那样,这将在通过的级别切断树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-05
      • 2020-05-26
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多