internal Expression Funcletize(
            Expression expression,
            out Func <bool> recompileRequired)
        {
            expression = this.ReplaceRootContextParameter(expression);
            Func <Expression, bool> isClientConstant;
            Func <Expression, bool> isClientVariable;

            if (this._mode == Funcletizer.Mode.CompiledQueryEvaluation)
            {
                isClientConstant = Funcletizer.Nominate(expression, new Func <Expression, bool>(this.IsClosureExpression));
                isClientVariable = Funcletizer.Nominate(expression, new Func <Expression, bool>(this.IsCompiledQueryParameterVariable));
            }
            else if (this._mode == Funcletizer.Mode.CompiledQueryLockdown)
            {
                isClientConstant = Funcletizer.Nominate(expression, new Func <Expression, bool>(this.IsClosureExpression));
                isClientVariable = (Func <Expression, bool>)(exp => false);
            }
            else
            {
                isClientConstant = Funcletizer.Nominate(expression, new Func <Expression, bool>(this.IsImmutable));
                isClientVariable = Funcletizer.Nominate(expression, new Func <Expression, bool>(this.IsClosureExpression));
            }
            Funcletizer.FuncletizingVisitor funcletizingVisitor = new Funcletizer.FuncletizingVisitor(this, isClientConstant, isClientVariable);
            Expression expression1 = funcletizingVisitor.Visit(expression);

            recompileRequired = funcletizingVisitor.GetRecompileRequiredFunction();
            return(expression1);
        }
        // <summary>
        // Overrides CreateExpressionConverter to return a converter that uses a binding context based on the compiled query parameters,
        // rather than a default binding context.
        // </summary>
        // <returns> An expression converter appropriate for converting this compiled query state instance </returns>
        protected override ExpressionConverter CreateExpressionConverter()
        {
            var lambda      = (LambdaExpression)base.Expression;
            var funcletizer = Funcletizer.CreateCompiledQueryEvaluationFuncletizer(
                ObjectContext, lambda.Parameters.First(), new ReadOnlyCollection <ParameterExpression>(lambda.Parameters.Skip(1).ToList()));

            // Return a new expression converter that uses the initialized command tree and binding context.
            return(new ExpressionConverter(funcletizer, lambda.Body));
        }
 internal FuncletizingVisitor(
     Funcletizer funcletizer,
     Func <Expression, bool> isClientConstant,
     Func <Expression, bool> isClientVariable)
 {
     this._funcletizer      = funcletizer;
     this._isClientConstant = isClientConstant;
     this._isClientVariable = isClientVariable;
 }
Exemple #4
0
            internal FuncletizingVisitor(
                Funcletizer funcletizer,
                Func <Expression, bool> isClientConstant,
                Func <Expression, bool> isClientVariable)
            {
                DebugCheck.NotNull(funcletizer);
                DebugCheck.NotNull(isClientConstant);
                DebugCheck.NotNull(isClientVariable);

                _funcletizer      = funcletizer;
                _isClientConstant = isClientConstant;
                _isClientVariable = isClientVariable;
            }
 protected virtual ExpressionConverter CreateExpressionConverter()
 {
     return(new ExpressionConverter(Funcletizer.CreateQueryFuncletizer(this.ObjectContext), this._expression));
 }
            internal FuncletizingVisitor(
                Funcletizer funcletizer,
                Func<Expression, bool> isClientConstant,
                Func<Expression, bool> isClientVariable)
            {
                DebugCheck.NotNull(funcletizer);
                DebugCheck.NotNull(isClientConstant);
                DebugCheck.NotNull(isClientVariable);

                _funcletizer = funcletizer;
                _isClientConstant = isClientConstant;
                _isClientVariable = isClientVariable;
            }
        internal ExpressionConverter(Funcletizer funcletizer, Expression expression)
        {
            DebugCheck.NotNull(funcletizer);
            DebugCheck.NotNull(expression);

            // Funcletize the expression (identify subexpressions that should be evaluated
            // locally)
            _funcletizer = funcletizer;
            expression = funcletizer.Funcletize(expression, out _recompileRequired);

            // Normalize the expression (replace obfuscated parts of the tree with simpler nodes)
            var normalizer = new LinqExpressionNormalizer();
            _expression = normalizer.Visit(expression);

            _perspective = funcletizer.RootContext.Perspective;
            _bindingContext = new BindingContext();
            _ignoreInclude = 0;
            _orderByLifter = new OrderByLifter(_aliasGenerator);
        }
            internal FuncletizingVisitor(
                Funcletizer funcletizer,
                Func<Expression, bool> isClientConstant,
                Func<Expression, bool> isClientVariable)
            {
                Contract.Requires(funcletizer != null);
                Contract.Requires(isClientConstant != null);
                Contract.Requires(isClientVariable != null);

                _funcletizer = funcletizer;
                _isClientConstant = isClientConstant;
                _isClientVariable = isClientVariable;
            }
Exemple #9
0
        protected virtual ExpressionConverter CreateExpressionConverter()
        {
            var funcletizer = Funcletizer.CreateQueryFuncletizer(ObjectContext);

            return(new ExpressionConverter(funcletizer, _expression));
        }
Exemple #10
0
        protected override ExpressionConverter CreateExpressionConverter()
        {
            LambdaExpression expression = (LambdaExpression)base.Expression;

            return(new ExpressionConverter(Funcletizer.CreateCompiledQueryEvaluationFuncletizer(this.ObjectContext, expression.Parameters.First <ParameterExpression>(), new ReadOnlyCollection <ParameterExpression>((IList <ParameterExpression>)expression.Parameters.Skip <ParameterExpression>(1).ToList <ParameterExpression>())), expression.Body));
        }