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))); }
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')); }
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); }
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); }
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); }
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)); }