MethodCallTransformerUtility provides utility methods for MethodCallTransformers.
Esempio n. 1
0
        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));
        }
Esempio n. 3
0
    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);
            }
        }