2010-01-29 3 views
3

Как воспроизвести следующий результат в моем запросе LINQ без вызова в вспомогательной библиотеке System.data.Linq.SqlClient?Использование LINQ Содержит по сравнению с SqlMethods.Like

Where SqlMethods.Like(e.POSITION, "%A[FGL]7%") _ 

Я бы хотел, чтобы этот запрос был более чисто LINQ, если это возможно.

ответ

9

EDIT: Основываясь на моих комментариях с Lette, я сначала пропустил шаблон, соответствующий SqlMethods.Like.

Ваш запрос выглядит как VB, так что вы можете реально использовать Like operator напрямую, но вам нужно заменить % звездочкой *:

Where e.POSITION Like "*A[FGL]7*" _ 

Если вы используете C# вы должны будете либо используйте Lette's suggestion после звонка AsEnumerable(), чтобы получить данные в памяти (возможно, сначала фильтровать по любым другим критериям , затем вызывать регулярное выражение для дальнейшей фильтрации) или следовать Ruben's suggestion.

Методы, упомянутые ниже, не действуют на 100%, как метод SqlMethods.Like, поскольку шаблон по существу экранирован. Другими словами, это относится только к буквальному тексту.


Просто используйте метод регулярных String.Contains на нем:

Where e.POSITION.Contains("A[FGL]7") 

LINQ к SQL будет переводить методы .NET таким образом:

  • текст. StartsWith (...) = LIKE ...%
  • текст. Содержит (...) = LIKE %...%
  • текст. EndsWith (...) = LIKE %...
+0

Вопрос Linq-To-Sql? Если это так, вы, вероятно, правы. У меня создается впечатление, что OP хочет «чистого» решения Linq. –

+0

@Lette Я считаю, так как OP использует класс SqlMethods, который поддерживается только в LINQ to SQL (http://msdn.microsoft.com/en-us/library/bb355235.aspx). –

+0

Я знал это, но вопрос не помечен как «linq-to-sql» ... –

1

Разъяснение: Этот ответ написан с предположением, что это не вопрос LINQ to SQL. Если да, перейдите к другому ответу (-ам).

Для этого вам необходимо будет подражать оператору Like от SQL. Это в вашем случае, вероятно, лучше всего сделать с регулярным выражением.

Вот пример:

using System.Text.RegularExpressions; 

... 

Regex regex = new Regex("^.*A[FGL]7.*$"); 

// assuming that 'e' is a sequence of elements of type Foo 
IEnumerable<Foo> results = e.Where(foo => regex.IsMatch(foo.POSITION)); 

results должен теперь быть отфильтрованы в соответствии с вашими потребностями.

+0

Важно отметить, что использование регулярного выражения в LINQ to SQL будет вызывать 'NotSupportedException', поскольку он« не поддерживает перевод SQL ». Единственным способом для этого было бы использовать '.AsEnumerable()' в таблице, что обычно нежелательно, так как вся таблица столкнулась с нефильтрованной. Regex отлично, но для этого простого случая методы, предоставляемые классом строк, будут достаточными, даже если это не запрос LINQ to SQL. –

+0

@Ahmad - Вы должны будете помнить, что этот ответ написан с предположением, что это * не * вопрос linq-to-sql. В этом контексте «string.Contains» не хватит. OP явно хочет фильтровать по шаблону. –

+0

Я абсолютно согласен, и я не собирался атаковать ваш ответ. Если это L2S, то мой комментарий действителен. В противном случае ваше решение будет абсолютно корректным. Тем не менее, я не согласен с вашим взятием на 'String.Contains'. Шаблон '% A [FGL] 7%' эквивалентен вашему регулярному выражению; т.е. он встречается где угодно в строке, поэтому строка «содержит» его и «String.Contains» будет работать. –

1

Большинство провайдеров LINQ поддержки оператора VB Like, который делает почти то же самое. С C# вы можете получить доступ к этой функции через Microsoft.VisualBasic.CompilerServices.LikeOperator «s LikeString метод:

using Microsoft.VisualBasic; 
using Microsoft.VisualBasic.CompilerServices; 

... 

where LikeOperator.LikeString(e.POSITION, "*A[FGL]7*", CompareMethod.Text) 

ли нужно учитывать, что, как VB использует несколько иной синтаксис, чем Like SQL в; в частности он использует * и ?, а не % и _. (LINQ к SQL переводит этот VB синтаксис для синтаксиса SQL, хотя.)

(Не забудьте сослаться Microsoft.VisualBasic.dll хотя.)

0

рассмотреть что-то вроде этого для информации о профиле членства:

matches = matches.Union(memberDB.aspnet_Profile 
        .Where("it.PropertyValuesString Like @first", new ObjectParameter("first", "%<FirstName>%" + firstName + "%</FirstName>%")) 
        .Select(p => p.UserId)); 
Смежные вопросы