Example #1
0
        public ExpressionConverter()
        {
            _entityProperties = MappedEntity <TModel, TEntity> .EntityProperties;

            _propertyMap      = new PropertyConverterMap(MappedEntity <TModel, TEntity> .PropertyMap.Cast <PropertyConverter>());
            _defaultVisitor   = new DefaultExpressionVisitor();
            _parameterVisitor = new ParameterExpressionVisitor(_propertyMap);
        }
        public static Expression Extract <T>(IQueryable qry, ParameterExpression parameterExpression, string parameterName)
        {
            MethodCallExpression methodCallExpression             = qry.Expression as MethodCallExpression;
            Expression <Func <LambdaExpression> > executionLambda = Expression.Lambda <Func <LambdaExpression> >(methodCallExpression.Arguments[1]);
            Expression extractedExpression = (executionLambda.Compile().Invoke() as Expression <Func <T, bool> >).Body;

            var filterExpressionVisitor = new ParameterExpressionVisitor(parameterExpression, parameterName);

            return(filterExpressionVisitor.Visit(extractedExpression));
        }
Example #3
0
        /// <summary>
        /// 合并操作
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sourceExpression">原表达式</param>
        /// <param name="pendingExpression">待合并的表达式</param>
        /// <param name="mergeFunc">合并后的表达式</param>
        /// <returns></returns>
        private static Expression <T> Merge <T>(this Expression <T> sourceExpression, Expression <T> pendingExpression, Func <Expression, Expression, Expression> mergeFunc)
        {
            Dictionary <ParameterExpression, ParameterExpression> dictionary = sourceExpression.Parameters.Select((ParameterExpression left, int i) => new
            {
                left,
                right = pendingExpression.Parameters[i]
            }).ToDictionary(p => p.right, p => p.left);
            Expression arg = ParameterExpressionVisitor.VisitParameters(dictionary, pendingExpression.Body);

            return(Expression.Lambda <T>(mergeFunc(sourceExpression.Body, arg), sourceExpression.Parameters));
        }
        /// <summary>
        /// Extracts the "Where" clause Expression from an IQueryable
        /// </summary>
        /// <param name="qry">The qry.</param>
        /// <param name="parameterExpression">The original parameter expression.</param>
        /// <param name="parameterName">Name of the parameter (forexample: 'p') from the qry to replace with the parameterExpression.</param>
        /// <returns></returns>
        public static Expression Extract(IQueryable qry, ParameterExpression parameterExpression, string parameterName)
        {
            var methodCallExpression = qry.Expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            var executionLambda = Expression.Lambda <Func <LambdaExpression> >(methodCallExpression.Arguments[1]);

            var extractedExpression = (executionLambda.Compile().Invoke()).Body;

            var filterExpressionVisitor = new ParameterExpressionVisitor(parameterExpression, parameterName);

            return(filterExpressionVisitor.Visit(extractedExpression));
        }
        public LambdaExpression[] GetMapExpression(Type sourceType, Type destinationType, object parameters, MemberInfo[] membersToExpand)
        {
            var expressionRequest = new ExpressionRequest(
                sourceType ?? throw new ArgumentNullException(nameof(sourceType)),
                destinationType ?? throw new ArgumentNullException(nameof(destinationType)),
                membersToExpand ?? throw new ArgumentNullException(nameof(membersToExpand)),
                null);
            var cachedExpressions = _expressionCache.GetOrAdd(expressionRequest);

            return(Array.ConvertAll(cachedExpressions, Prepare));

            LambdaExpression Prepare(Expression cachedExpression)
            {
                var result = parameters == null ? cachedExpression : ParameterExpressionVisitor.SetParameters(parameters, cachedExpression);

                return((LambdaExpression)(_configurationProvider.EnableNullPropagationForQueryMapping ? NullsafeQueryRewriter.NullCheck(result) : result));
            }
        }
Example #6
0
        private Expression Prepare(Expression cachedExpression, object parameters)
        {
            Expression result;

            if (parameters != null)
            {
                var visitor = ParameterExpressionVisitor.Create(parameters);
                result = visitor.Visit(cachedExpression);
            }
            else
            {
                result = cachedExpression;
            }
            // perform null-propagation if this feature is enabled.
            if (_configurationProvider.EnableNullPropagationForQueryMapping)
            {
                var nullVisitor = new NullsafeQueryRewriter();
                return(nullVisitor.Visit(result));
            }
            return(result);
        }
        public void Or(Expression <Func <TModel, bool> > predicate)
        {
            if (predicate == null)
            {
                return;
            }

            var exp = new ParameterExpressionVisitor(predicate.Parameters[0], _parameter).Visit(predicate.Body);

            if (_expression == null)
            {
                _expression = exp;
            }
            else
            {
                _expression = Expression.Or(
                    _expression,
                    exp
                    );
            }
        }
Example #8
0
        /// <summary>
        /// Replaces a parameter in the expression.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <param name="parameterName">Name of the parameter to be replaced.</param>
        /// <param name="parameterExpression">The parameter expression to use in the replacement.</param>
        /// <returns>A new Expression if the original expression was modified; otherwise the original expression.</returns>
        public static Expression ReplaceParameter(this Expression expression, string parameterName, ParameterExpression parameterExpression)
        {
            var filterExpressionVisitor = new ParameterExpressionVisitor(parameterExpression, parameterName);

            return(filterExpressionVisitor.Visit(expression));
        }