2011-02-02 2 views
1

Я использую LINQ для создания динамического sql, когда я использую его, я не хочу, чтобы он был префикс и суффикс%, и если я использую% внутри моей строки, я хочу избежать этого. Она сбегает процентные знаки, добавленные мной, используя ~ в качестве префикса перед тем, как% последовательностями маскирующегоLINQ содержит appends% и escapes%

Например:

string str = '%test%.doc%' 
.Contains(str) // converts this into LIKE '%~%test~%.doc~%%' 

Ожидаемого Conversion: LIKE '% тест% .doc %%'

+0

Например, строка Str = '% тест% .doc%' это моя строка .Contains (ул) должна возьмите его как есть, не переведите его в «%% test ~% .doc %%», где ~ указано как escape seq char – WhoIsNinja

+0

Какой LINQ? LINQ to SQL? –

+2

LINQ to SQL и EF4 - это разные вещи. Что вы используете? –

ответ

1

как задавал вопрос, я ответил на мои вопросы

См. Using LINQ Contains vs. SqlMethods.Like и вообще метод SqlMethods.Like, который позволит вам сделать пользовательский LIKE с Linq-to-sql.

Простой пример:

var res = from row in dc.Table 
      where SqlMethods.Like(row.Column, "%A%A%") 
      select row; 

Больше примеров с Contains, StartsWith и Like: http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/16/linq-to-sql-like-operator.aspx

0

Содержит вероятно, переводится на использование оператора LIKE в SQL. Этот оператор принимает % в качестве символа подстановки. Contains("abc") карты до LIKE '%abc%'.

+0

да, но я не могу использовать .Equals, поскольку он будет использовать = вместо LIKE. а также он по-прежнему будет скрывать% в моей строке. См. Мой пример в комментариях к комментариям. – WhoIsNinja

+0

Какова конкретная проблема, вызываемая этим? И отредактируйте свой вопрос, чтобы сделать его более ясным - не используйте для этого комментарии. –

+0

отредактировал вопрос. – WhoIsNinja

0

Я использую следующие расширения, чтобы избежать этого случая (хотя в моем конкретном случае я все еще использую подстановочные знаки, но вы можете изменить его для собственного эффекта).

public static bool Like(this string value, string term) 
    { 
     Regex regex = new Regex(string.Format("^{0}$", term.Replace("*", ".*")), RegexOptions.IgnoreCase); 
     return regex.IsMatch(value ?? string.Empty); 
    } 

    public static IEnumerable<string> Like(this IEnumerable<string> source, string expression) 
    { 
     return (from s in source where s.Like(expression) select s); 
    } 
+0

Только что увидел, что вы используете L2S. Не уверен, что добавленные выше расширения помогут в этом случае, но я оставлю ответ в случае, если это будет полезно. – nkirkes

+0

И, чтобы дать кредит там, где это произошло, я изначально натолкнулся на идею этих расширений на этом посту: http://www.devexpertise.com/2009/09/25/implementing-a-linq-version-of-sqls- как-оператор / – nkirkes

0

К сожалению, я не могу думать о простой способ сделать это, но это может работать:

var a = from t in Db.Tests 
     let i1 = t.Name.IndexOf("test") 
     let i2 = t.Name.IndexOf(".doc") 
     where i1 != -1 && i2 != -1 && i1 < i2 
     select t; 

Вот эквивалент в методе цепей:

Db.Tests.Select(t => new {t, i1 = t.Name.IndexOf("test")}).Select(
       @t1 => new {@t1, i2 = @t1.t.Name.IndexOf(".doc")}).Where(
        @t1 => @[email protected] != -1 && @t1.i2 != -1 && @[email protected] < @t1.i2).Select(@t1 => @[email protected]);