Esempio n. 1
0
        protected virtual void OptimizeQueryModel([NotNull] QueryModel queryModel)
        {
            Check.NotNull(queryModel, nameof(queryModel));

            new QueryOptimizer(QueryCompilationContext.QueryAnnotations).VisitQueryModel(queryModel);

            var navigationRewritingExpressionTreeVisitor = new NavigationRewritingExpressionVisitor(this);

            navigationRewritingExpressionTreeVisitor.Rewrite(queryModel);

            var subQueryMemberPushDownExpressionVisitor = new SubQueryMemberPushDownExpressionVisitor();

            queryModel.TransformExpressions(subQueryMemberPushDownExpressionVisitor.Visit);

            QueryCompilationContext.Logger.LogInformation(queryModel, Strings.LogOptimizedQueryModel);
        }
        protected override Expression VisitNew(NewExpression expression)
        {
            Check.NotNull(expression, nameof(expression));

            if (expression.Members != null &&
                expression.Arguments.Any() &&
                expression.Arguments.Count == expression.Members.Count)
            {
                var memberBindings
                    = expression.Arguments
                      .Select(Visit)
                      .Where(e => e != null)
                      .ToArray();

                if (memberBindings.Length == expression.Arguments.Count)
                {
                    return(Expression.Constant(memberBindings));
                }
            }
            else if (NavigationRewritingExpressionVisitor.IsCompositeKey(expression.Type))
            {
                var propertyCallExpressions
                    = ((NewArrayExpression)expression.Arguments.Single()).Expressions;

                var memberBindings
                    = propertyCallExpressions
                      .Select(Visit)
                      .Where(e => e != null)
                      .ToArray();

                if (memberBindings.Length == propertyCallExpressions.Count)
                {
                    return(Expression.Constant(memberBindings));
                }
            }

            return(null);
        }