public Expression Transform(MethodCallExpression methodCallExpression) { ArgumentUtility.CheckNotNull("methodCallExpression", methodCallExpression); MethodCallTransformerUtility.CheckArgumentCount(methodCallExpression, 1, 2); MethodCallTransformerUtility.CheckInstanceMethod(methodCallExpression); var startIndexExpression = Expression.Add(methodCallExpression.Arguments[0], new SqlLiteralExpression(1)); if (methodCallExpression.Arguments.Count == 1) { return(new SqlFunctionExpression( methodCallExpression.Type, "STUFF", methodCallExpression.Object, startIndexExpression, new SqlLengthExpression(methodCallExpression.Object), new SqlLiteralExpression(""))); } else if (methodCallExpression.Arguments.Count == 2) { return(new SqlFunctionExpression( methodCallExpression.Type, "STUFF", methodCallExpression.Object, startIndexExpression, methodCallExpression.Arguments[1], new SqlLiteralExpression(""))); } else { var message = string.Format( "Remove function with {0} arguments is not supported. Expression: '{1}'", methodCallExpression.Arguments.Count, methodCallExpression); throw new NotSupportedException(message); } }
public Expression Transform(MethodCallExpression methodCallExpression) { ArgumentUtility.CheckNotNull("methodCallExpression", methodCallExpression); MethodCallTransformerUtility.CheckArgumentCount(methodCallExpression, 2); MethodCallTransformerUtility.CheckInstanceMethod(methodCallExpression); MethodCallTransformerUtility.CheckConstantExpression("Insert", methodCallExpression.Arguments[0], "insertionIndex"); var insertionIndexExpression = Expression.Add(methodCallExpression.Arguments[0], new SqlLiteralExpression(1)); var testExpression = Expression.Equal(new SqlLengthExpression(methodCallExpression.Object), insertionIndexExpression); var concatMethod = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }); var thenExpression = Expression.Add(methodCallExpression.Object, methodCallExpression.Arguments[1], concatMethod); var elseExpression = new SqlFunctionExpression( methodCallExpression.Type, "STUFF", methodCallExpression.Object, insertionIndexExpression, new SqlLiteralExpression(0), methodCallExpression.Arguments[1]); return(Expression.Condition(testExpression, thenExpression, elseExpression)); }
public Expression Transform (MethodCallExpression methodCallExpression) { ArgumentUtility.CheckNotNull ("methodCallExpression", methodCallExpression); if (methodCallExpression.Arguments.Count == 1) { MethodCallTransformerUtility.CheckInstanceMethod (methodCallExpression); return ConversionUtility.MakeBinaryWithOperandConversion ( ExpressionType.Equal, methodCallExpression.Object, methodCallExpression.Arguments[0], false, null); } else if (methodCallExpression.Arguments.Count == 2) { MethodCallTransformerUtility.CheckStaticMethod (methodCallExpression); return ConversionUtility.MakeBinaryWithOperandConversion ( ExpressionType.Equal, methodCallExpression.Arguments[0], methodCallExpression.Arguments[1], false, null); } var message = string.Format ( "{0} function with {1} arguments is not supported. Expression: '{2}'", methodCallExpression.Method.Name, methodCallExpression.Arguments.Count, FormattingExpressionTreeVisitor.Format(methodCallExpression)); throw new NotSupportedException (message); }
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); } }