Remotion.Linq.SqlBackend.SqlPreparation.MethodCallTransformers.InsertMethodCallTransformer.Transform C# (CSharp) Method

Transform() public method

public Transform ( MethodCallExpression methodCallExpression ) : Expression
methodCallExpression System.Linq.Expressions.MethodCallExpression
return System.Linq.Expressions.Expression
    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);
    }
  }

Usage Example

    public void Transform ()
    {
      var method = typeof (string).GetMethod ("Insert", new[] { typeof(int), typeof(string) });
      var objectExpression = Expression.Constant ("Test");
      var argument1 = Expression.Constant(3);
      var argument2 = Expression.Constant("what");
      var expression = Expression.Call (objectExpression, method, argument1, argument2);
      var transformer = new InsertMethodCallTransformer ();

      var result = transformer.Transform (expression);

      var expectedTestExpression = Expression.Equal (new SqlLengthExpression (objectExpression), Expression.Add (argument1, new SqlLiteralExpression (1)));
      var concatMethod = typeof (string).GetMethod ("Concat", new[] { typeof (string), typeof (string) });
      var expectedThenExpression = Expression.Add (objectExpression, argument2, concatMethod);
      var expectedElseExpression = new SqlFunctionExpression (typeof (string), "STUFF", objectExpression, Expression.Add (argument1, new SqlLiteralExpression (1)), new SqlLiteralExpression(0), argument2);
      var expectedResult = Expression.Condition (expectedTestExpression, expectedThenExpression, expectedElseExpression);
      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);
    }
InsertMethodCallTransformer