public List <TreeNode> FindNodes(string typeName, [Required, FromBody] FindNodesRequest request) { Type type = TypeLogic.GetType(typeName); var list = giFindNodesGeneric.GetInvoker(type)(request); return(ToTreeNodes(list)); }
static List <TreeInfo> FindNodesGeneric <T>(FindNodesRequest request) where T : TreeEntity { var qd = QueryLogic.Queries.QueryDescription(typeof(T)); var userFilters = request.userFilters.Select(f => f.ToFilter(qd, false)).ToList(); var frozenFilters = request.frozenFilters.Select(f => f.ToFilter(qd, false)).ToList(); var frozenQuery = QueryLogic.Queries.GetEntities(new QueryEntitiesRequest { QueryName = typeof(T), Filters = frozenFilters, Orders = new List <Order>() }) .Select(a => (T)a.Entity); var filteredQuery = QueryLogic.Queries.GetEntities(new QueryEntitiesRequest { QueryName = typeof(T), Filters = userFilters.Concat(frozenFilters).ToList(), Orders = new List <Order>() }) .Select(a => (T)a.Entity); var disabledMixin = MixinDeclarations.IsDeclared(typeof(T), typeof(DisabledMixin)); var list = filteredQuery .SelectMany(t => t.Ascendants()) .Select(t => new TreeInfo { route = t.Route, name = t.Name, lite = t.ToLite(), level = t.Level(), disabled = disabledMixin && t.Mixin <DisabledMixin>().IsDisabled, childrenCount = frozenQuery.Count(a => (bool)(a.Route.GetAncestor(1) == t.Route)), }).ToList(); var expandedChildren = request.expandedNodes.IsNullOrEmpty() ? new List <TreeInfo>() : frozenQuery .Where(t => request.expandedNodes.Contains(t.Parent().ToLite())) .SelectMany(t => t.Ascendants()) .Select(t => new TreeInfo { route = t.Route, name = t.Name, lite = t.ToLite(), level = t.Level(), disabled = disabledMixin && t.Mixin <DisabledMixin>().IsDisabled, childrenCount = frozenQuery.Count(a => (bool)(a.Route.GetAncestor(1) == t.Route)), }).ToList(); return(list.Concat(expandedChildren).ToList()); }