예제 #1
0
        /// <summary>Prepare the given expression for passing as a predicate to a filter function
        ///  i.e. Queryable.Where()/Enumerable.Any()/Enumerable.All().
        /// </summary>
        /// <param name="expr">Input expression.</param>
        /// <returns>Expression converted to boolean expression.</returns>
        internal static Expression EnsurePredicateExpressionIsBoolean(Expression expr)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(expr))
            {
                expr = OpenTypeMethods.EqualExpression(expr, Expression.Constant(true, typeof(object)));
                expr = Expression.Convert(expr, typeof(bool));
            }
            else if (IsNullConstant(expr))
            {
                expr = falseLiteral;
            }
            else if (expr.Type == typeof(bool?))
            {
                Expression test = Expression.Equal(expr, Expression.Constant(null, typeof(bool?)));
                expr = Expression.Condition(test, falseLiteral, Expression.Property(expr, "Value"));
            }

            if (expr.Type != typeof(bool))
            {
                string message = Strings.RequestQueryParser_ExpressionTypeMismatch(WebUtil.GetTypeName(typeof(bool)));
                throw DataServiceException.CreateSyntaxError(message);
            }

            return(expr);
        }
예제 #2
0
        /// <summary>Generates a Logical Or expression.</summary>
        /// <param name="left">Left expression.</param>
        /// <param name="right">Right expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateLogicalOr(Expression left, Expression right)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(left) || OpenTypeMethods.IsOpenPropertyExpression(right))
            {
                return(OpenTypeMethods.OrElseExpression(left, right));
            }

            return(Expression.OrElse(left, right));
        }
예제 #3
0
        /// <summary>Generates a logical And expression.</summary>
        /// <param name="left">Left expression.</param>
        /// <param name="right">Right expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateLogicalAnd(Expression left, Expression right)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(left) || OpenTypeMethods.IsOpenPropertyExpression(right))
            {
                return(OpenTypeMethods.AndAlsoExpression(left, right));
            }

            return(Expression.AndAlso(left, right));
        }
예제 #4
0
        /// <summary>Generates a modulo expression.</summary>
        /// <param name="left">Left expression.</param>
        /// <param name="right">Right expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateModulo(Expression left, Expression right)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(left) || OpenTypeMethods.IsOpenPropertyExpression(right))
            {
                return(OpenTypeMethods.ModuloExpression(left, right));
            }

            return(Expression.Modulo(left, right));
        }
예제 #5
0
        /// <summary>Generates a divide expression.</summary>
        /// <param name="left">Left expression.</param>
        /// <param name="right">Right expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateDivide(Expression left, Expression right)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(left) || OpenTypeMethods.IsOpenPropertyExpression(right))
            {
                return(OpenTypeMethods.DivideExpression(left, right));
            }

            return(Expression.Divide(left, right));
        }
예제 #6
0
        /// <summary>Generates a negative of expression.</summary>
        /// <param name="expr">Input expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateNegate(Expression expr)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(expr))
            {
                return(OpenTypeMethods.NegateExpression(expr));
            }

            return(Expression.Negate(expr));
        }
예제 #7
0
        /// <summary>Generates a subtract expression.</summary>
        /// <param name="left">Left expression.</param>
        /// <param name="right">Right expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateSubtract(Expression left, Expression right)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(left) || OpenTypeMethods.IsOpenPropertyExpression(right))
            {
                return(OpenTypeMethods.SubtractExpression(left, right));
            }

            return(Expression.Subtract(left, right));
        }
예제 #8
0
        /// <summary>Generates a NotEqual expression.</summary>
        /// <param name="left">Left expression.</param>
        /// <param name="right">Right expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateNotEqual(Expression left, Expression right)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(left) || OpenTypeMethods.IsOpenPropertyExpression(right))
            {
                return(OpenTypeMethods.NotEqualExpression(left, right));
            }

            if (left.Type == typeof(byte[]))
            {
                return(Expression.NotEqual(left, right, false, AreByteArraysNotEqualMethodInfo));
            }

            return(Expression.NotEqual(left, right));
        }
예제 #9
0
        /// <summary>Generates a GreaterThanOrEqual comparsion expression.</summary>
        /// <param name="left">Left expression.</param>
        /// <param name="right">Right expression.</param>
        /// <param name="comparisonMethodInfo">MethodInfo for comparison method used for string, bool, guid types</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateGreaterThanEqual(Expression left, Expression right, MethodInfo comparisonMethodInfo)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(left) || OpenTypeMethods.IsOpenPropertyExpression(right))
            {
                return(OpenTypeMethods.GreaterThanOrEqualExpression(left, right));
            }

            if (comparisonMethodInfo != null)
            {
                left  = Expression.Call(null, comparisonMethodInfo, left, right);
                right = Expression.Constant(0, typeof(int));
            }

            return(Expression.GreaterThanOrEqual(left, right));
        }
예제 #10
0
        /// <summary>Generates a not of expression.</summary>
        /// <param name="expr">Input expression.</param>
        /// <returns>The generated expression.</returns>
        internal static Expression GenerateNot(Expression expr)
        {
            if (OpenTypeMethods.IsOpenPropertyExpression(expr))
            {
                return(OpenTypeMethods.NotExpression(expr));
            }

            if (expr.Type == typeof(bool) || expr.Type == typeof(Nullable <bool>))
            {
                // Expression.Not will take numerics and apply '~' to them, thus the extra check here.
                return(Expression.Not(expr));
            }
            else
            {
                string message = Strings.RequestQueryParser_NotDoesNotSupportType(expr.Type);
                throw DataServiceException.CreateSyntaxError(message);
            }
        }