/// <summary> /// 以树节点加载算法加载数据。 /// </summary> /// <param name="list">The list.</param> /// <param name="nodes">The nodes.</param> /// <param name="indexOption">The index option.</param> internal static void LoadTreeData(IList <Entity> list, IEnumerable nodes, TreeIndexOption indexOption) { /*********************** 代码块解释 ********************************* * 树节点加载算法: * 由于树节点在查询时 *已经通过 TreeIndex 来排序* 了,本质上是一种树的深度遍历序。 * 所以我们只需要记录最后一次添加的节点,然后通过它尝试找到与要添加的节点的父节点, * 如果没有找到,则直接把要添加的节点添加到列表中。 * 这样,就以一种顺序的方式完成了整个节点的加载。 **********************************************************************/ //最后一次添加的节点。 Entity lastNode = null; foreach (Entity entity in nodes) { var treePId = entity.TreePId; if (treePId == null) { bool isRootList = list.Count == 0 || list[0].TreePId == null; if (isRootList) { list.Add(entity); lastNode = entity; } } else { //尝试通过最后一次添加的节点来找到与 entity 关联的父节点。 var parentNode = lastNode; while (parentNode != null && !treePId.Equals(parentNode.Id)) { parentNode = parentNode.TreeParentData; } //如果没有找到 parentNode,则加入到列表中。否则,加入到 parentNode 下。 if (parentNode == null) { var added = TryAddToList(list, entity, indexOption); if (added) { lastNode = entity; } } else { parentNode.TreeChildren.LoadAdd(entity); lastNode = entity; } } } }
/// <summary> /// 必须要同一级的节点才能加入到实体列表中。 /// Test:TET_Query_LoadSubTreeIgnoreOtherNodes /// </summary> /// <param name="list"></param> /// <param name="node"></param> /// <param name="indexOption"></param> private static bool TryAddToList(IList <Entity> list, Entity node, TreeIndexOption indexOption) { if (list.Count > 0) { var listLevel = indexOption.CountLevel(list[0].TreeIndex); var nodeLevel = indexOption.CountLevel(node.TreeIndex); if (listLevel == nodeLevel) { list.Add(node); return(true); } } else { list.Add(node); return(true); } return(false); }