private GraphExpression CreateCollectionGraphExpression(
            FieldNode fieldNode,
            ParameterExpression parameter,
            PropertyInfo prop,
            Type schemaType)
        {
            var genericType     = prop.PropertyType.GetGenericArguments().First();
            var innerParameter  = Expression.Parameter(genericType, _expressionParameters.Next());
            var childSchemaType = schemaType.GetProperty(prop.Name).PropertyType.GetGenericArguments().First();

            var innerExpression = CreateNewExpression(fieldNode, genericType, childSchemaType, innerParameter);

            var graphExpression = new GraphExpression
            {
                Property = new DynamicProperty(prop.Name, typeof(object)),

                Expression = Expression.Call(typeof(Enumerable),
                                             nameof(Enumerable.Select),
                                             new Type[] { genericType, _typeCollection.Load(genericType.FullName) },
                                             Expression.Property(parameter, prop.Name),
                                             Expression.Lambda(innerExpression, innerParameter))
            };

            return(graphExpression);
        }
Exemplo n.º 2
0
        private List <GraphExpression> CreateGraphExpressionList(
            IReadOnlyList <ISelectionNode> selections,
            Type type,
            ParameterExpression parameter,
            string parentName = null)
        {
            var graphExpressions = new List <GraphExpression>();

            var propertyLookup = new PropertyLookup(type);

            foreach (FieldNode fieldNode in selections)
            {
                PropertyInfo propertyInfo = propertyLookup.FindProperty(fieldNode.Name.Value);

                if (propertyInfo != null)
                {
                    GraphExpression graphExpression = CreateGraphExpression(propertyInfo, fieldNode, parameter, parentName);
                    if (graphExpression != null)
                    {
                        graphExpressions.Add(graphExpression);
                    }
                }
            }
            return(graphExpressions);
        }
        private List <GraphExpression> CreateGraphExpressionList(
            IReadOnlyList <ISelectionNode> selections,
            Type type,
            Type schemaType,
            ParameterExpression parameter,
            string parentName,
            params string[] filters)
        {
            var graphExpressions = new List <GraphExpression>();
            var joinProperties   = new List <GraphSchema>();
            var propertyLookup   = new PropertyLookup(type);
            var schemaLookup     = new PropertyLookup(schemaType);

            foreach (FieldNode fieldNode in selections)
            {
                var currentNodes = FilterNodes(fieldNode, filters);

                foreach (var currentNode in currentNodes)
                {
                    PropertyInfo schemaInfo = schemaLookup.FindProperty(currentNode.Name.Value);
                    if (schemaInfo != null)
                    {
                        var joinAttr = schemaInfo.GetCustomAttribute <JoinAttribute>();
                        if (joinAttr != null)
                        {
                            PropertyInfo propertyInfo = propertyLookup.FindProperty(joinAttr.PropertyName);
                            joinProperties.Add(new GraphSchema(propertyInfo, schemaInfo));
                        }
                        else
                        {
                            PropertyInfo    propertyInfo    = propertyLookup.FindProperty(currentNode.Name.Value);
                            GraphExpression graphExpression = CreateGraphExpression(propertyInfo, currentNode, parameter, schemaType, parentName);
                            graphExpressions.Add(graphExpression);
                        }
                    }
                }
            }

            var joinGroups = joinProperties.GroupBy(f => f.Property.Name);

            foreach (var joinGroup in joinGroups)
            {
                graphExpressions.Add(CreateJoinGraphExpression(parameter, joinGroup));
            }

            return(graphExpressions);
        }