Exemplo n.º 1
0
        protected override Expression VisitMemberExpression(MemberExpression memberExpression)
        {
            var newExpression = VisitExpression(memberExpression.Expression);

            if (newExpression != memberExpression.Expression)
            {
                if (newExpression.Type == typeof(ValueBuffer))
                {
                    return(_queryModelVisitor.BindMemberToValueBuffer(memberExpression, newExpression)
                           ?? memberExpression);
                }

                var member   = memberExpression.Member;
                var typeInfo = newExpression.Type.GetTypeInfo();

                if (typeInfo.IsGenericType &&
                    typeInfo.GetGenericTypeDefinition() == typeof(IAsyncGrouping <,>))
                {
                    member = typeInfo.GetDeclaredProperty("Key");
                }

                return(Expression.MakeMemberAccess(newExpression, member));
            }

            return(memberExpression);
        }
        private static Expression HandleValueFromOpenJson(
            EntityQueryModelVisitor entityQueryModelVisitor,
            ValueFromOpenJsonOperator valueFromOpenJsonOperator,
            QueryModel queryModel)
        {
            var visitor = new MemberAccessBindingExpressionVisitor(entityQueryModelVisitor.QueryCompilationContext.QuerySourceMapping
                                                                   , entityQueryModelVisitor
                                                                   , false);

            if (valueFromOpenJsonOperator.Json is MemberExpression me)
            {
                if (me.Expression is ParameterExpression pe)
                {
                    var mapping = entityQueryModelVisitor.QueryCompilationContext.QuerySourceMapping;
                    if (mapping.ContainsMapping(queryModel.MainFromClause))
                    {
                        if (QuerySourceMappingLookup.GetValue(mapping) is IDictionary <IQuerySource, Expression> lookup)
                        {
                            var source = lookup.Keys.FirstOrDefault(s => s.ItemType == pe.Type && s.ItemName == pe.Name);
                            source = source ?? lookup.Keys.SingleOrDefault(s => s.ItemType == pe.Type);
                            if (source != null)
                            {
                                var exp = mapping.GetExpression(source);
                                if (exp != null)
                                {
                                    if (exp.Type == typeof(ValueBuffer))
                                    {
                                        var entityType = entityQueryModelVisitor.QueryCompilationContext.Model.FindEntityType(pe.Type);
                                        if (entityType != null)
                                        {
                                            var prop = entityType.FindProperty(me.Member as PropertyInfo);
                                            if (prop != null)
                                            {
                                                var json = entityQueryModelVisitor.BindMemberToValueBuffer(me, exp);
                                                return(Expression.Call(valueFromOpenJsonOperator.ParseInfo.ParsedExpression.Method
                                                                       , valueFromOpenJsonOperator.ParseInfo.ParsedExpression.Arguments[0]
                                                                       , json
                                                                       , valueFromOpenJsonOperator.Path));
                                            }
                                        }
                                    }

                                    var meexp = Expression.MakeMemberAccess(exp, me.Member);
                                    return(Expression.Call(valueFromOpenJsonOperator.ParseInfo.ParsedExpression.Method
                                                           , valueFromOpenJsonOperator.ParseInfo.ParsedExpression.Arguments[0]
                                                           , meexp
                                                           , valueFromOpenJsonOperator.Path));
                                }
                            }
                        }
                    }
                }
            }

            return(entityQueryModelVisitor.Expression);
        }
        protected override Expression VisitMember(MemberExpression node)
        {
            var expression = node.Expression.RemoveConvert();

            if ((expression != node.Expression) &&
                !(expression is QuerySourceReferenceExpression))
            {
                expression = node.Expression;
            }

            var newExpression = Visit(expression);

            if (newExpression != expression)
            {
                if (newExpression.Type == typeof(ValueBuffer))
                {
                    return(_queryModelVisitor
                           .BindMemberToValueBuffer(node, newExpression)
                           ?? node);
                }

                var member   = node.Member;
                var typeInfo = newExpression.Type.GetTypeInfo();

                if (typeInfo.IsGenericType &&
                    ((typeInfo.GetGenericTypeDefinition() == typeof(IGrouping <,>)) ||
                     (typeInfo.GetGenericTypeDefinition() == typeof(IAsyncGrouping <,>))))
                {
                    member = typeInfo.GetDeclaredProperty("Key");
                }

                return(Expression.MakeMemberAccess(newExpression, member));
            }

            return(node);
        }