using System; using System.Collections.Generic; using System.Linq; namespace WalkingTec.Mvvm.Core.Extensions { /// /// 树形结构Model的扩展函数 /// public static class ITreeDataExtension { /// /// 获取一个父节点下的所有子节点,包括子节点的子节点 /// /// 树形结构类 /// 树形结构实例 /// 排序字段,可为空 /// 树形结构列表,包含所有子节点 public static List GetAllChildren(this T self, Func order = null) where T : TreePoco { List rv = new List(); var children = self.Children; if(order != null && children != null) { children = children.OrderBy(order).ToList(); } if (children != null && children.Count() > 0) { //var dictinct = children.Where(x => x.GetID().ToString() != self.GetID().ToString()).ToList(); foreach (var item in children) { rv.Add(item); //递归添加子节点的子节点 rv.AddRange(item.GetAllChildren(order)); } } return rv; } public static int GetLevel(this T self) where T : TreePoco { int level = 0; while (self.Parent != null) { level++; self = self.Parent; } return level; } /// /// 查询数据库,根据某个节点ID递归获取其下所有级别的子节点ID /// /// 树形结构类 /// 树形结构实例 /// dc /// 子节点ID列表 /// 所有级别子节点ID public static List GetAllChildrenIDs(this T self , IDataContext dc , List subids = null) where T : TreePoco { List rv = new List(); List ids = null; if (subids == null) { ids = dc.Set().Where(x => x.ParentId == self.ID).Select(x => x.ID).ToList(); } else { ids = dc.Set().Where(x => subids.Contains(x.ParentId.Value)).Select(x => x.ID).ToList(); } if (ids != null && ids.Count > 0) { rv.AddRange(ids); rv.AddRange(self.GetAllChildrenIDs(dc, ids)); } return rv; } /// /// 将树形结构列表转变为标准列表 /// /// 树形结构类 /// 树形结构实例 /// 排序字段,可以为空 /// 返回标准列表,所有节点都在同一级上 public static List FlatTree(this List self, Func order = null) where T :TreePoco { List rv = new List(); if(order != null) { self = self.OrderBy(order).ToList(); } foreach (var item in self) { rv.Add(item); rv.AddRange(item.GetAllChildren(order)); } return rv; } /// /// 将树形结构列表转变为标准列表 /// /// 树形结构实例 /// 排序字段,可以为空 /// 返回标准列表,所有节点都在同一级上 public static IEnumerable FlatTreeSelectList(this IEnumerable self, Func order = null) { List rv = new List(); if (order != null) { self = self.OrderBy(order).ToList(); } foreach (var item in self) { rv.Add(item); if (item.Children != null) { rv.AddRange(item.GetTreeSelectChildren(order)); } } return rv; } /// /// 获取TreeSelect节点下所有子节点 /// /// /// /// public static List GetTreeSelectChildren(this TreeSelectListItem self, Func order = null) { List rv = new List(); var children = self.Children; if (order != null && children != null) { children = children.OrderBy(order).ToList(); } if (children != null && children.Count() > 0) { var dictinct = children.Where(x => x.Value != self.Value).ToList(); foreach (var item in dictinct) { rv.Add(item); //递归添加子节点的子节点 rv.AddRange(item.GetTreeSelectChildren(order)); } } return rv; } } }