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;
}
}
}