Example #1
0
        /// <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;
                    }
                }
            }
        }
Example #2
0
        /// <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);
        }