Represents a sql 'LIKE' command
Inheritance: Remotion.Linq.Clauses.Expressions.ExtensionExpression
 public void SetUp ()
 {
   var leftExpression = Expression.Constant ("left");
   var rightExpression = Expression.Constant ("right");
   var escapeExpression = new SqlLiteralExpression (@"\");
   _likeExpression = new SqlLikeExpression (leftExpression, rightExpression, escapeExpression);
 }
        private static Expression BuildRightExpression(Expression unescapedSearchText, string likePrefix, string likePostfix)
        {
            Expression rightExpression;
            var        argumentAsConstantExpression = unescapedSearchText as ConstantExpression;

            if (argumentAsConstantExpression != null)
            {
                if (argumentAsConstantExpression.Value == null)
                {
                    rightExpression = null;
                }
                else
                {
                    var escapedSearchText = SqlLikeExpression.Escape((string)argumentAsConstantExpression.Value, @"\");
                    rightExpression = Expression.Constant(string.Format("{0}{1}{2}", likePrefix, escapedSearchText, likePostfix));
                }
            }
            else
            {
                var escapedSearchExpression = SqlLikeExpression.Escape(unescapedSearchText, @"\");
                var concatMethod            = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) });
                var patternWithPrefix       =
                    !string.IsNullOrEmpty(likePrefix)
                ? Expression.Add(new SqlLiteralExpression(likePrefix), escapedSearchExpression, concatMethod)
                : escapedSearchExpression;
                var patternWithPrefixAndPostfix =
                    !string.IsNullOrEmpty(likePostfix)
                ? Expression.Add(patternWithPrefix, new SqlLiteralExpression(likePostfix), concatMethod)
                : patternWithPrefix;
                rightExpression = patternWithPrefixAndPostfix;
            }
            return(rightExpression);
        }
    public void Transform ()
    {
      MethodCallExpression expression = (MethodCallExpression) ExpressionHelper.MakeExpression<string, bool> (s => s.SqlLike ("%es%"));

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

      var expectedResult = new SqlLikeExpression (expression.Arguments[0], expression.Arguments[1], new SqlLiteralExpression (@"\"));
      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);
    }
    public void Create_ArgumentIsNotNull ()
    {
      var objectExpression = Expression.Constant ("Test");
      var argument1 = Expression.Constant ("test");
      
      var result = SqlLikeExpression.Create (objectExpression, argument1, "%", "%");
      
      var rightExpression = Expression.Constant (string.Format ("%{0}%", argument1.Value));
      var expectedResult = new SqlLikeExpression (objectExpression, rightExpression, new SqlLiteralExpression (@"\"));

      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);
    }
    public void Transform_ArgumentIsNotNull ()
    {
      var method = typeof (string).GetMethod ("StartsWith", new[] { typeof (string) });
      var objectExpression = Expression.Constant ("Test");
      var argument1 = Expression.Constant ("test");
      var expression = Expression.Call (objectExpression, method, argument1);
      var transformer = new StartsWithMethodCallTransformer();
      var result = transformer.Transform (expression);

      var rightExpression = Expression.Constant (string.Format ("{0}%", argument1.Value));

      var expectedResult = new SqlLikeExpression (objectExpression, rightExpression, new SqlLiteralExpression (@"\"));
      
      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);
    }
    public void Create_ArgumentIsNotNullAndNoConstantExpression ()
    {
      var method = typeof (string).GetMethod ("Contains", new[] { typeof (string) });
      var objectExpression = Expression.Constant ("Test");
      var argument1 = Expression.MakeMemberAccess (Expression.Constant (new Cook ()), typeof (Cook).GetProperty ("Name"));
      var expression = Expression.Call (objectExpression, method, argument1);
      
      var result = SqlLikeExpression.Create(expression.Object, expression.Arguments[0], "%", "%");

      Expression rightExpression = new SqlFunctionExpression (
          typeof (string),
          "REPLACE",
          new SqlFunctionExpression (
              typeof (string),
              "REPLACE",
                 new SqlFunctionExpression (
                      typeof (string),
                      "REPLACE",
                      new SqlFunctionExpression (
                          typeof (string),
                          "REPLACE",
                          argument1,
                          new SqlLiteralExpression (@"\"),
                          new SqlLiteralExpression (@"\\")),
                      new SqlLiteralExpression (@"%"),
                      new SqlLiteralExpression (@"\%")),
                  new SqlLiteralExpression (@"_"),
                  new SqlLiteralExpression (@"\_")),
              new SqlLiteralExpression (@"["),
              new SqlLiteralExpression (@"\["));
      rightExpression = Expression.Add (
          new SqlLiteralExpression ("%"), rightExpression, typeof (string).GetMethod ("Concat", new[] { typeof (string), typeof (string) }));
      rightExpression = Expression.Add (
          rightExpression, new SqlLiteralExpression ("%"), typeof (string).GetMethod ("Concat", new[] { typeof (string), typeof (string) }));
      var expectedResult = new SqlLikeExpression (objectExpression, rightExpression, new SqlLiteralExpression (@"\"));

      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);  
    }
    public void Transform_ArgumentIsNotNullAndIsNoConstantValue_ ()
    {
      var method = typeof (string).GetMethod ("StartsWith", new[] { typeof (string) });
      var objectExpression = Expression.Constant ("Test");
      var argument1 = Expression.MakeMemberAccess (Expression.Constant (new Cook ()), typeof (Cook).GetProperty ("Name"));
      var expression = Expression.Call (objectExpression, method, argument1);
      var transformer = new StartsWithMethodCallTransformer ();

      var result = transformer.Transform (expression);

      Expression rightExpression = new SqlFunctionExpression (
          typeof (string),
          "REPLACE",
          new SqlFunctionExpression (
              typeof (string),
              "REPLACE",
                 new SqlFunctionExpression (
                      typeof (string),
                      "REPLACE",
                      new SqlFunctionExpression (
                          typeof (string),
                          "REPLACE",
                          argument1,
                          new SqlLiteralExpression (@"\"),
                          new SqlLiteralExpression (@"\\")),
                      new SqlLiteralExpression (@"%"),
                      new SqlLiteralExpression (@"\%")),
                  new SqlLiteralExpression (@"_"),
                  new SqlLiteralExpression (@"\_")),
              new SqlLiteralExpression (@"["),
          new SqlLiteralExpression (@"\["));
      rightExpression = Expression.Add (
          rightExpression, new SqlLiteralExpression ("%"), typeof (string).GetMethod ("Concat", new[] { typeof (string), typeof (string) }));
      var expectedResult = new SqlLikeExpression (objectExpression, rightExpression, new SqlLiteralExpression (@"\"));

      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);
    }
 public Expression VisitSqlLikeExpression (SqlLikeExpression expression)
 {
   return VisitChildrenWithGivenSemantics (expression, SqlExpressionContext.SingleValueRequired);
 }
    public void VisitSqlLikeExpression ()
    {
      var sqlInExpression = new SqlLikeExpression (new SqlLiteralExpression (1), new SqlLiteralExpression (2), new SqlLiteralExpression (@"\"));

      SqlGeneratingExpressionVisitor.GenerateSql (sqlInExpression, _commandBuilder, _stageMock);

      Assert.That (_commandBuilder.GetCommandText (), Is.EqualTo (@"1 LIKE 2 ESCAPE '\'"));
    }
    public void SqlLikeExpression ()
    {
      var expression = new SqlLikeExpression (Expression.Constant (true), Expression.Constant (true), new SqlLiteralExpression (@"\"));
      var expectedResult = new SqlLikeExpression (
          new SqlConvertedBooleanExpression (Expression.Constant (1)), new SqlConvertedBooleanExpression (Expression.Constant (1)), new SqlLiteralExpression (@"\"));

      var result = _predicateRequiredVisitor.VisitSqlLikeExpression (expression);

      SqlExpressionTreeComparer.CheckAreEqualTrees (expectedResult, result);
    }