public void Transform_WithTwoArgument_TypeString()
        {
            var method           = typeof(string).GetMethod("IndexOf", new[] { typeof(string), typeof(int) });
            var objectExpression = Expression.Constant("Test");

            var argument1   = Expression.Constant("es");
            var argument2   = Expression.Constant(2);
            var expression  = Expression.Call(objectExpression, method, argument1, argument2);
            var transformer = new IndexOfMethodCallTransformer();
            var result      = transformer.Transform(expression);

            var startIndexExpression = Expression.Add(argument2, new SqlLiteralExpression(1));

            var lenArgExpression  = new SqlLengthExpression(argument1);
            var leftTestPredicate = Expression.Equal(lenArgExpression, new SqlLiteralExpression(0));

            var lenObjectExpression = new SqlLengthExpression(objectExpression);
            var rightTestpredicate  = Expression.LessThanOrEqual(startIndexExpression, lenObjectExpression);
            var testPredicate       = Expression.AndAlso(leftTestPredicate, rightTestpredicate);

            var charIndexExpression = new SqlFunctionExpression(
                expression.Type, "CHARINDEX", argument1, objectExpression, startIndexExpression);

            var elseValue = Expression.Subtract(charIndexExpression, new SqlLiteralExpression(1));

            var expectedResult = Expression.Condition(testPredicate, argument2, elseValue);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
        public void Initialization_Char()
        {
            var charExpression   = Expression.Constant('t');
            var lengthExpression = new SqlLengthExpression(charExpression);

            Assert.That(lengthExpression.Expression, Is.SameAs(charExpression));
            Assert.That(lengthExpression.Type, Is.EqualTo(typeof(int)));
        }
        public void Initialization_String()
        {
            var stringExpression = Expression.Constant("test");
            var lengthExpression = new SqlLengthExpression(stringExpression);

            Assert.That(lengthExpression.Expression, Is.SameAs(stringExpression));
            Assert.That(lengthExpression.Type, Is.EqualTo(typeof(int)));
        }
Пример #4
0
        public void VisitSqlLengthExpression_Char()
        {
            var innnerExpression = Expression.Constant('t');
            var expression       = new SqlLengthExpression(innnerExpression);

            SqlGeneratingExpressionVisitor.GenerateSql(expression, _commandBuilder, _stageMock);

            Assert.That(_commandBuilder.GetCommandText(), Is.EqualTo("(LEN((@1 + '#')) - 1)"));
            Assert.That(_commandBuilder.GetCommandParameters()[0].Value, Is.EqualTo('t'));
        }
Пример #5
0
        public void VisitMemberExpression_WithProperty_Registered()
        {
            var stringExpression = Expression.Constant("test");
            var memberExpression = Expression.Property(stringExpression, "Length");

            var result = SqlPreparationExpressionVisitor.TranslateExpression(memberExpression, _context, _stageMock, _methodCallTransformerProvider);

            var expectedResult = new SqlLengthExpression(stringExpression);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
Пример #6
0
        public void VisitPartialEvaluationExceptionExpression_StripsExceptionAndVisitsInnerExpression()
        {
            var evaluatedExpression = Expression.Property(Expression.Constant(""), "Length");
            var exception           = new InvalidOperationException("What?");
            var expression          = new PartialEvaluationExceptionExpression(exception, evaluatedExpression);

            var result = SqlPreparationExpressionVisitor.TranslateExpression(expression, _context, _stageMock, _methodCallTransformerProvider);

            var expectedExpression = new SqlLengthExpression(evaluatedExpression.Expression);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedExpression, result);
        }
Пример #7
0
        public Expression Transform(MethodCallExpression methodCallExpression)
        {
            ArgumentUtility.CheckNotNull("methodCallExpression", methodCallExpression);

            MethodCallTransformerUtility.CheckArgumentCount(methodCallExpression, 1);
            MethodCallTransformerUtility.CheckStaticMethod(methodCallExpression);

            var isNullExpression    = new SqlIsNullExpression(methodCallExpression.Arguments[0]);
            var lenExpression       = new SqlLengthExpression(methodCallExpression.Arguments[0]);
            var lenIsZeroExpression = Expression.Equal(lenExpression, new SqlLiteralExpression(0));

            return(Expression.OrElse(isNullExpression, lenIsZeroExpression));
        }
        public void Transform()
        {
            var method           = typeof(string).GetMethod("get_Length", new Type[] { });
            var objectExpression = Expression.Constant("Test");
            var expression       = Expression.Call(objectExpression, method);
            var transformer      = new StringLengthMethodCallTransformer();

            var result = transformer.Transform(expression);

            var expectedResult = new SqlLengthExpression(objectExpression);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
        public void Transform()
        {
            var method           = typeof(string).GetMethod("IsNullOrEmpty", new[] { typeof(string) });
            var objectExpression = Expression.Constant("Test");
            var expression       = Expression.Call(method, objectExpression);
            var transformer      = new IsNullOrEmptyMethodCallTransformer();

            var result = transformer.Transform(expression);

            var expectedIsNullExpression = new SqlIsNullExpression(objectExpression);
            var expectedLenExpression    = new SqlLengthExpression(objectExpression);
            var expectedResult           = Expression.OrElse(expectedIsNullExpression, Expression.Equal(expectedLenExpression, new SqlLiteralExpression(0)));

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
Пример #10
0
        public Expression VisitSqlLengthExpression(SqlLengthExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            // Since the SQL LEN function ignores trailing blanks, we add one character and subtract 1 from the result.
            // LEN (x + '#') - 1

            var concatMethod   = typeof(string).GetMethod("Concat", new[] { typeof(object), typeof(object) });
            var extendedString = Expression.Add(
                expression.Expression.Type == typeof(char) ? Expression.Convert(expression.Expression, typeof(object)) : expression.Expression,
                new SqlLiteralExpression("#"),
                concatMethod);

            var newExpression = Expression.Subtract(new SqlFunctionExpression(typeof(int), "LEN", extendedString), new SqlLiteralExpression(1));

            return(VisitExpression(newExpression));
        }
        public void Transform_WithOneArgument_TypeChar()
        {
            var method           = typeof(string).GetMethod("IndexOf", new[] { typeof(char) });
            var objectExpression = Expression.Constant("Test");

            var argument1   = Expression.Constant('e');
            var expression  = Expression.Call(objectExpression, method, argument1);
            var transformer = new IndexOfMethodCallTransformer();
            var result      = transformer.Transform(expression);

            var lenExpression       = new SqlLengthExpression(argument1);
            var testPredicate       = Expression.Equal(lenExpression, new SqlLiteralExpression(0));
            var charIndexExpression = new SqlFunctionExpression(
                expression.Type, "CHARINDEX", argument1, objectExpression);
            var elseValue = Expression.Subtract(charIndexExpression, new SqlLiteralExpression(1));

            var expectedResult = Expression.Condition(testPredicate, new SqlLiteralExpression(0), elseValue);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
        public Expression Transform(MethodCallExpression methodCallExpression)
        {
            MethodCallTransformerUtility.CheckArgumentCount(methodCallExpression, 1, 2, 3);
            MethodCallTransformerUtility.CheckInstanceMethod(methodCallExpression);

            if (methodCallExpression.Arguments.Count == 1)
            {
                var lenExpression       = new SqlLengthExpression(methodCallExpression.Arguments[0]);
                var testPredicate       = Expression.Equal(lenExpression, new SqlLiteralExpression(0));
                var charIndexExpression = new SqlFunctionExpression(
                    methodCallExpression.Type, "CHARINDEX", methodCallExpression.Arguments[0], methodCallExpression.Object);
                var elseValue = Expression.Subtract(charIndexExpression, new SqlLiteralExpression(1));

                return(Expression.Condition(testPredicate, new SqlLiteralExpression(0), elseValue));
            }
            else if (methodCallExpression.Arguments.Count == 2)
            {
                var startIndexExpression = Expression.Add(methodCallExpression.Arguments[1], new SqlLiteralExpression(1));

                var lenArgExpression  = new SqlLengthExpression(methodCallExpression.Arguments[0]);
                var leftTestPredicate = Expression.Equal(lenArgExpression, new SqlLiteralExpression(0));

                var lenObjectExpression = new SqlLengthExpression(methodCallExpression.Object);
                var rightTestpredicate  = Expression.LessThanOrEqual(startIndexExpression, lenObjectExpression);
                var testPredicate       = Expression.AndAlso(leftTestPredicate, rightTestpredicate);

                var charIndexExpression = new SqlFunctionExpression(
                    methodCallExpression.Type, "CHARINDEX", methodCallExpression.Arguments[0], methodCallExpression.Object, startIndexExpression);

                var elseValue = Expression.Subtract(charIndexExpression, new SqlLiteralExpression(1));

                return(Expression.Condition(testPredicate, methodCallExpression.Arguments[1], elseValue));
            }
            else if (methodCallExpression.Arguments.Count == 3)
            {
                var startIndexExpression = Expression.Add(methodCallExpression.Arguments[1], new SqlLiteralExpression(1));

                var lenArgExpression  = new SqlLengthExpression(methodCallExpression.Arguments[0]);
                var leftTestPredicate = Expression.Equal(lenArgExpression, new SqlLiteralExpression(0));

                var lenObjectExpression = new SqlLengthExpression(methodCallExpression.Object);
                var rightTestpredicate  = Expression.LessThanOrEqual(startIndexExpression, lenObjectExpression);
                var testPredicate       = Expression.AndAlso(leftTestPredicate, rightTestpredicate);

                var startAddCountExpression = Expression.Add(methodCallExpression.Arguments[1], methodCallExpression.Arguments[2]);
                var substringExpression     = new SqlFunctionExpression(
                    typeof(string), "SUBSTRING", methodCallExpression.Object, new SqlLiteralExpression(1), startAddCountExpression);

                var charIndexExpression = new SqlFunctionExpression(
                    methodCallExpression.Type, "CHARINDEX", methodCallExpression.Arguments[0], substringExpression, startIndexExpression);

                var elseValue = Expression.Subtract(charIndexExpression, new SqlLiteralExpression(1));

                return(Expression.Condition(testPredicate, methodCallExpression.Arguments[1], elseValue));
            }
            else
            {
                var message = string.Format(
                    "IndexOf function with {0} arguments is not supported. Expression: '{1}'",
                    methodCallExpression.Arguments.Count,
                    FormattingExpressionTreeVisitor.Format(methodCallExpression));
                throw new NotSupportedException(message);
            }
        }
 public void SetUp()
 {
     _innerExpression  = Expression.Constant("test");
     _lengthExpression = new SqlLengthExpression(_innerExpression);
 }
 public Expression VisitSqlLength(SqlLengthExpression expression)
 {
     return(VisitChildrenWithGivenSemantics(expression, SqlExpressionContext.SingleValueRequired));
 }