示例#1
0
        /// <summary>
        /// Replaces the parameter of the expression with given one.
        /// </summary>
        /// <typeparam name="T">Type the expression is being used on.</typeparam>
        /// <param name="expression">Expression to be changed.</param>
        /// <param name="parameter">Parameter for the new expression.</param>
        /// <returns>The expression with the new parameter.</returns>
        private static Expression ReplaceParameter <T>(Expression <Func <T, bool> > expression, ParameterExpression parameter)
        {
            var visitor       = new ReplaceParameterVisitor(expression.Parameters[0], parameter);
            var newexpression = visitor.Visit(expression.Body);

            return(newexpression);
        }
示例#2
0
        public MemberExpression GetJoinPropertyExpression(Expression source, Expression parameter, SingleValuePropertyAccessNode propertyNode)
        {
            IReadOnlyList <IEdmNavigationProperty> joinPath = GetJoinPath(propertyNode);
            MemberExpression propertyExpression             = GetJoinPropertyExpression(source, parameter, joinPath, propertyNode.Property);

            if (propertyExpression != null)
            {
                return(propertyExpression);
            }

            propertyExpression = (MemberExpression)Visitor.TranslateNode(propertyNode);
            if (propertyExpression == null)
            {
                throw new InvalidOperationException("property " + propertyNode.Property.Name + " not found");
            }

            if (Visitor.Parameter == parameter)
            {
                return(propertyExpression);
            }

            var replaceParameterVisitor = new ReplaceParameterVisitor(Visitor.Parameter, parameter);

            return((MemberExpression)replaceParameterVisitor.Visit(propertyExpression));
        }
        public static Expression <Func <T, bool> > AndAlso <T>(this Expression <Func <T, bool> > expr1, Expression <Func <T, bool> > expr2)
        {
            ParameterExpression parameter1 = expr1.Parameters[0];
            var visitor         = new ReplaceParameterVisitor(expr2.Parameters[0], parameter1);
            var body2WithParam1 = visitor.Visit(expr2.Body);

            return(Expression.Lambda <Func <T, bool> >(Expression.AndAlso(expr1.Body, body2WithParam1), parameter1));
        }
        /// <summary>
        /// Returns a new expression where references to the specified parameter
        /// have been replaced by references to another one.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <param name="original">The original parameter.</param>
        /// <param name="replacement">The replacement parameter.</param>
        /// <returns></returns>
        public static Expression ReplaceParameter(
            this Expression expression,
            ParameterExpression original,
            Expression replacement
            )
        {
            var visitor = new ReplaceParameterVisitor(original, replacement);

            return(visitor.Visit(expression));
        }
    public static Expression <Func <T, bool> > Or <T>(this Expression <Func <T, bool> > one, Expression <Func <T, bool> > another)
    {
        var parameter = one.Parameters[0];
        var visitor   = new ReplaceParameterVisitor(parameter);

        another = (Expression <Func <T, bool> >)visitor.Visit(another);
        var body = Expression.Or(one.Body, another.Body);

        return(Expression.Lambda <Func <T, bool> >(body, parameter));
    }
示例#6
0
        /// <summary>
        /// An Expression&lt;Func&lt;T,bool&gt;&gt; extension method that with parameters of.
        /// </summary>
        /// <typeparam name="T">Generic type parameter.</typeparam>
        /// <param name="left">The left.</param>
        /// <param name="right">The right.</param>
        /// <param name="expressionType">Type of the expression.</param>
        /// <returns>An Expression&lt;Func&lt;T,bool&gt;&gt;</returns>
        private static Expression <Func <T, bool> > WithParametersOf <T>(this Expression <Func <T, bool> > left,
                                                                         Expression <Func <T, bool> > right, ExpressionType expressionType)
        {
            var visitor = new ReplaceParameterVisitor {
                SubstituteMapping = { [right.Parameters[0]] = left.Parameters[0] }
            };

            Expression body = Expression.MakeBinary(expressionType, left.Body, visitor.Visit(right.Body));

            return(Expression.Lambda <Func <T, bool> >(body, left.Parameters[0]));
        }
示例#7
0
        public static Expression <Func <T, bool> > Combine <T>(Expression <Func <T, bool> > leftExpression, Expression <Func <T, bool> > rightExpression, Func <Expression, Expression, BinaryExpression> combineOperator)
        {
            var leftParameter  = leftExpression.Parameters[0];
            var rightParameter = rightExpression.Parameters[0];

            var visitor = new ReplaceParameterVisitor(rightParameter, leftParameter);

            var leftBody  = leftExpression.Body;
            var rightBody = visitor.Visit(rightExpression.Body);

            return(Expression.Lambda <Func <T, bool> >(combineOperator(leftBody, rightBody), leftParameter));
        }
        /// <summary>
        /// Returns a new expression where references to the specified parameter
        /// have been replaced by references to another one.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <param name="original">The original parameter.</param>
        /// <param name="replacement">The replacement parameter.</param>
        /// <param name="wasReplaced">Indicates whether the <paramref name="original"/> has been replaced at least once.</param>
        /// <returns></returns>
        public static Expression ReplaceParameter(
            this Expression expression,
            ParameterExpression original,
            Expression replacement,
            out bool wasReplaced
            )
        {
            var visitor = new ReplaceParameterVisitor(original, replacement);
            var result  = visitor.Visit(expression);

            wasReplaced = visitor.WasReplaced;
            return(result);
        }
        public static MemberExpression GetPropertyExpression(OeJoinBuilder joinBuilder, Expression source, Expression parameterExpression, SingleValueNode sortProperty)
        {
            if (sortProperty is SingleValuePropertyAccessNode propertyNode)
            {
                return(joinBuilder.GetJoinPropertyExpression(source, parameterExpression, propertyNode));
            }

            if (sortProperty is SingleValueOpenPropertyAccessNode openPropertyNode)
            {
                var propertyExpression      = (MemberExpression)joinBuilder.Visitor.TranslateNode(openPropertyNode);
                var replaceParameterVisitor = new ReplaceParameterVisitor(joinBuilder.Visitor.Parameter, parameterExpression);
                return((MemberExpression)replaceParameterVisitor.Visit(propertyExpression));
            }

            throw new InvalidOperationException("Unknown type order by expression " + sortProperty.GetType().Name);
        }
示例#10
0
    public static Expression <Func <TElement, bool> > ReplaceParameter <TElement>(
        Expression <Func <TElement, TElement, bool> > inputExpression,
        TElement element)
    {
        Expression body = inputExpression.Body;
        ReplaceParameterVisitor visitor =
            new ReplaceParameterVisitor(inputExpression.Parameters[1],
                                        Expression.Constant(element, typeof(TElement)));
        Expression newBody = visitor.Visit(body);
        Expression <Func <TElement, bool> > newExpression =
            Expression.Lambda <Func <TElement, Boolean> >(
                newBody,
                new ParameterExpression[] { inputExpression.Parameters[0] });

        return(newExpression);
    }
        public MemberExpression GetJoinPropertyExpression(Expression source, Expression parameter, SingleValuePropertyAccessNode propertyNode)
        {
            IReadOnlyList <IEdmNavigationProperty> joinPath = GetJoinPath(propertyNode);
            MemberExpression?joinPropertyExpression         = GetJoinPropertyExpression(source, parameter, joinPath, propertyNode.Property);

            if (joinPropertyExpression != null)
            {
                return(joinPropertyExpression);
            }

            var propertyExpression = (MemberExpression)Visitor.TranslateNode(propertyNode);

            if (Visitor.Parameter == parameter)
            {
                return(propertyExpression);
            }

            var replaceParameterVisitor = new ReplaceParameterVisitor(Visitor.Parameter, parameter);

            return((MemberExpression)replaceParameterVisitor.Visit(propertyExpression));
        }
示例#12
0
        /// <summary>
        /// Replace parameter <paramref name="oldExpression"/> by <paramref name="newExpression"/>.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <param name="oldExpression">The parameter to be replaced.</param>
        /// <param name="newExpression">The expression to replace all occurrences of <paramref name="oldExpression"/>.</param>
        /// <returns>New expression with applied replacement.</returns>
        public static Expression ReplaceParameter(
            this Expression expression,
            ParameterExpression oldExpression,
            Expression newExpression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            if (oldExpression == null)
            {
                throw new ArgumentNullException(nameof(oldExpression));
            }

            if (newExpression == null)
            {
                throw new ArgumentNullException(nameof(newExpression));
            }

            var visitor = new ReplaceParameterVisitor(oldExpression, newExpression);

            return(visitor.Visit(expression));
        }