我按照这个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
但没用。可能是什么问题?我怎样才能做到这一点?
答案 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()
这将按照预期通过级别切断树。