具有深度的递归层次连接

在C#和LINQ post中遵循这个Recursive Hierarchical Joins来实现递归连接扩展,以在我的应用程序中显示树视图数据。 由于我有15000个树节点,客户端准备的jQuery DynaTree在错误的浏览器IE 7和8中花费了大量时间(50秒)

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

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

public static List GenerateTreeByDepth(List nodeList, int deepLevel) { StringBuilder hirTree = new StringBuilder(); List tree = new List(); IEnumerable nodes = nodeList.RecursiveJoin (element => element.DataPointSK,element => element.DataPointSKParent, (NodeDTO element, int index, int depth,IEnumerable 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

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

RecursiveJoin扩展方法用于从原始节点构建树。 您正在使用的重载具有int深度参数,用于初始化新创建的节点以及它将驻留的级别,并且与构建的树的深度无关。

扩展本身是懒惰的。 当您第一次调用RecursiveJoin时,它将返回根的IEnumerable <>,这在您开始枚举之前不会实现。

您的代码问题在于您急切地将IEnumerable <> of children转换为list:

children = childNodes.ToList()

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

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

chidren = depth> = deepLevel? null:childNodes.ToList()

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