Как в лямбда-выражении и LINQ - PullRequest
37 голосов
/ 01 сентября 2010

Как я могу сделать что-то вроде этого:

customers.where(c=>c.Name **like** "john");

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

Ответы [ 6 ]

70 голосов
/ 01 сентября 2010
customers.Where(c => c.Name.Contains("john"));
30 голосов
/ 01 сентября 2010

Если вы нацелены на LINQ to SQL, используйте SqlMethods.Like :

customers.Where(c => SqlMethods.Like(c.Name, "%john%")); 

Объяснение:

Компилятор сгенерирует дерево выражений из приведенного выше оператора,Поскольку LIKE является специфической для SQL конструкцией и не является общей для всех поставщиков LINQ Query, класс SqlMethods и его члены используются в качестве «подсказки» для компилятора выражений (компилирует деревья выражений в SQL) для выдачи LIKEзаявление.

9 голосов
/ 01 сентября 2010

Первая мысль, которая приходит в голову: Regex.IsMatch.

Это будет ближе всего к предоставлению функциональности, которую вы получаете от LIKE; например, с ним вы можете сделать это:

var matches = people.Where(p => Regex.IsMatch(p.Name, "A.*[mn]"));

foreach (Person match in matches)
{
    Console.WriteLine(match.Name);
}

И получить вывод, как это:

Adam
Aaron
Aidan

Переход с string.Contains, как и предполагали другие, почти наверняка предпочтительнее, если вы намерены просто искать определенную подстроку в Name.

5 голосов
/ 01 сентября 2010
using System.Data.Linq.SqlClient;
...
customers.where(c=>SqlMethods.Like(c.Name, "john"));
2 голосов
/ 01 сентября 2010

Используйте Regex.IsMatch в вашем операторе where или для более простой версии без подстановочных знаков и т. Д.:

customers.where(c=>c.Name.Contains("john"));
1 голос
/ 03 августа 2017

Вот мой код:

string s="somethings";

customers.Where(c => c.Name != null && c.Name.ToLower().Contains(s.ToLower()));

Нечто подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...