private async Task GetParentModel(List <EntityParentModel> root, Dictionary <Guid, EntityParentModel[]> items, IEntityMetadata metadata, Guid?selected, string path) { IEntityMetadata parentMetadata = EntityAnalyzer.GetMetadata(metadata.ParentProperty.ClrType); dynamic context = EntityBuilder.GetContext(parentMetadata.Type); dynamic queryable = context.OrderBy(); if (parentMetadata.ParentProperty == null) { IEntity[] result = await context.ToArrayAsync(queryable); foreach (var item in result) { EntityParentModel model = new EntityParentModel(); model.Index = item.Index; model.Name = item.ToString(); model.Path = path; model.IsSelected = selected == item.Index; if (items.ContainsKey(model.Index)) { model.Items = items[model.Index]; } else { model.Items = new EntityParentModel[0]; } root.Add(model); } } else { Dictionary <Guid, EntityParentModel[]> newItems = new Dictionary <Guid, EntityParentModel[]>(); var parameter = Expression.Parameter(parentMetadata.Type); var parent = Expression.Property(parameter, parentMetadata.ParentProperty.ClrName); var expression = Expression.Lambda(parent, parameter); dynamic result = GetGrouping(queryable, parentMetadata.ParentProperty.ClrType, parentMetadata.Type, expression); List <EntityParentModel> thisRoot = null; if (parentMetadata.ParentProperty.ClrType == parentMetadata.Type) { thisRoot = new List <EntityParentModel>(); } Type groupType = typeof(IGrouping <,>).MakeGenericType(parentMetadata.ParentProperty.ClrType, parentMetadata.Type); foreach (dynamic item in result) { List <EntityParentModel> models = new List <EntityParentModel>(); IEntity key = groupType.GetProperty("Key").GetValue(item) as IEntity; foreach (IEntity entity in item) { EntityParentModel model = new EntityParentModel(); model.Index = entity.Index; model.Name = entity.ToString(); model.Path = path; model.IsSelected = selected == entity.Index; if (items.ContainsKey(model.Index)) { model.Items = items[model.Index]; } else { model.Items = new EntityParentModel[0]; } models.Add(model); } if (key == null) { root.AddRange(models); if (parentMetadata.ParentProperty.ClrType == parentMetadata.Type) { thisRoot.AddRange(models); } } else { newItems.Add(key.Index, models.ToArray()); } } if (parentMetadata.ParentProperty.ClrType == parentMetadata.Type) { ExpendTree(thisRoot, newItems); } else { await GetParentModel(root, newItems, parentMetadata, selected, path + "." + parentMetadata.ParentProperty.ClrName); } } }
private EntityParentModel[] GetParentModel(Guid?selected, int level) { EntityMetadata metadata = Metadata; List <EntityParentModel> final = new List <EntityParentModel>(); ParameterExpression parameter = Expression.Parameter(Metadata.Type); //获取Parent属性组 dynamic fl = GetGrouping(EntityQueryable.Query(), metadata.ParentProperty.Property.PropertyType, metadata.Type, GetLambda(metadata.Type, metadata.ParentProperty.Property.PropertyType, Expression.Property(parameter, Metadata.ParentProperty.Property), parameter)); string path = metadata.ParentProperty.Property.Name; List <EntityParentModel> parents = null; while (parents == null || parents.Count > 0) { if (parents == null) { parents = new List <EntityParentModel>(); } List <EntityParentModel> temp = new List <EntityParentModel>(); foreach (var f in fl) { Type ft = f.GetType(); IEntity entity = ft.GetProperty("Key").GetValue(f); if (entity == null) { continue; } EntityParentModel item = final.SingleOrDefault(t => t.Index == entity.Index); if (item == null) { item = new EntityParentModel(); item.Path = path; item.Name = entity.ToString(); item.Index = entity.Index; } if (selected.HasValue && item.Index == selected) { item.Selected = true; } //ParameterExpression dp = Expression.Parameter(metadata.Type); //dynamic dChildren = _ESelectMethod.MakeGenericMethod(metadata.Type, typeof(Guid)).Invoke(null, new object[] { f, GetLambda(metadata.Type, typeof(Guid), Expression.Property(dp, typeof(EntityBase).GetProperty("BaseIndex")), dp) }); dynamic dChildren = _ESelectMethod.MakeGenericMethod(metadata.Type, typeof(Guid)).Invoke(null, new object[] { f, new Func <IEntity, Guid>(GetBaseIndex) }); Guid[] children = Linq.Enumerable.ToArray <Guid>(dChildren); if (item.Items != null) { item.Items = item.Items.Concat(parents.Where(t => children.Contains(t.Index))).ToArray(); } else { item.Items = parents.Where(t => children.Contains(t.Index)).ToArray(); } if (!item.Selected && item.Items.Count(t => t.Selected) > 0) { item.Opened = true; } parents.RemoveAll(t => children.Contains(t.Index)); temp.Add(item); } final.AddRange(parents); parents = temp; Type groupType = typeof(IGrouping <,>).MakeGenericType(metadata.ParentProperty.Property.PropertyType, metadata.Type); metadata = EntityAnalyzer.GetMetadata(metadata.ParentProperty.Property.PropertyType); if (metadata.ParentProperty == null || parents.Count == 0) { final.AddRange(parents); break; } level--; if (level == 0) { final.AddRange(parents); break; } path += "." + metadata.ParentProperty.Property.Name; parameter = Expression.Parameter(groupType); var selectKey = GetLambda(groupType, metadata.Type, Expression.Property(parameter, groupType.GetProperty("Key")), parameter); parameter = Expression.Parameter(metadata.Type); fl = _QSelectMethod.MakeGenericMethod(groupType, metadata.Type).Invoke(null, new object[] { fl, selectKey }); var groupByKey = GetLambda(metadata.Type, metadata.ParentProperty.Property.PropertyType, Expression.Property(parameter, metadata.ParentProperty.Property), parameter); fl = GetGrouping(fl, metadata.ParentProperty.Property.PropertyType, metadata.Type, groupByKey); } return(final.ToArray()); }