具有深度的递归层次连接

时间:2013-02-21 13:08:27

标签: c# jquery linq dynatree

我按照这个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;

    }

我尝试过设置深度

  

Depth = deepLevel

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

1 个答案:

答案 0 :(得分:0)

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

扩展本身就是懒惰。当您第一次调用RecursiveJoin时,它将返回IEnumerable&lt;&gt;根,在你开始枚举之前没有实现。

您的代码问题在于您急切地转换IEnumerable&lt;&gt;把孩子列入名单:

  

children = childNodes.ToList()

这强制了子集合的实现,递归地再次调用相同的方法来构造DynaTreeNode,并重复所有级别。尝试用IEnumerable替换DynaTreeNode中的子列表 - 这将根据需要生成DynaTreeNodes。

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

  

chidren = depth&gt; = deepLevel? null:childNodes.ToList()

这将按照预期通过级别切断树。