Beispiel #1
0
        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());
        }