Remotion.Linq.SqlBackend.SqlPreparation.MethodCallTransformers.SubstringMethodCallTransformer.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, 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,
            "SUBSTRING",
            methodCallExpression.Object,
            startIndexExpression,
            new SqlLengthExpression (methodCallExpression.Object));
      }
      else if (methodCallExpression.Arguments.Count == 2)
      {
        return new SqlFunctionExpression (
            methodCallExpression.Type,
            "SUBSTRING",
            methodCallExpression.Object,
            startIndexExpression,
            methodCallExpression.Arguments[1]);
      }
      else
      {
        var message = string.Format (
            "Substring function with {0} arguments is not supported. Expression: '{1}'",
            methodCallExpression.Arguments.Count,
            FormattingExpressionTreeVisitor.Format (methodCallExpression));
        throw new NotSupportedException (message);
      }
    }
  }

Usage Example

    public void Transform_WithTwoArgument ()
    {
      var method = typeof (string).GetMethod ("Substring", new[] { typeof (int), typeof (int) });
      var objectExpression = Expression.Constant ("Test");
      var expression = Expression.Call (objectExpression, method, Expression.Constant (1), Expression.Constant (3));

      var transformer = new SubstringMethodCallTransformer();
      var result = transformer.Transform (expression);

      var expectedResult = new SqlFunctionExpression (
          expression.Type,
          "SUBSTRING",
          objectExpression,
          Expression.Add (Expression.Constant (1), new SqlLiteralExpression (1)),
          Expression.Constant (3)
          );

      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);
    }
SubstringMethodCallTransformer