Как сделать SQL Like% в Linq? - PullRequest
368 голосов
/ 07 мая 2009

У меня есть процедура в SQL, которую я пытаюсь превратить в Linq:

SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId
where OH.Hierarchy like '%/12/%'

Строка, которая меня больше всего интересует:

where OH.Hierarchy like '%/12/%'

У меня есть столбец, в котором хранится иерархия, например / 1/3/12 /, поэтому я просто использую% / 12 /% для его поиска.

У меня такой вопрос: что такое Linq или .NET эквивалентно использованию знака процента?

Ответы [ 13 ]

522 голосов
/ 07 мая 2009
.Where(oh => oh.Hierarchy.Contains("/12/"))

Вы также можете использовать .StartsWith() или .EndsWith().

245 голосов
/ 15 июня 2010

Используйте это:

from c in dc.Organization
where SqlMethods.Like(c.Hierarchy, "%/12/%")
select *;
40 голосов
/ 07 мая 2009

Я предполагаю, что вы используете Linq-to-SQL * (см. Примечание ниже). Если это так, используйте string.Contains, string.StartsWith и string.EndsWith для генерации SQL, в котором используется оператор SQL LIKE.

from o in dc.Organization
join oh in dc.OrganizationsHierarchy on o.Id equals oh.OrganizationsId
where oh.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

или

from o in dc.Organization
where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

Примечание: * = если вы используете ADO.Net Entity Framework (EF / L2E) в .net 3.5, учтите, что он не будет выполнять тот же перевод, что и Linq-to-SQL. Хотя L2S выполняет правильный перевод, L2E v1 (3.5) преобразуется в выражение t-sql, которое будет вызывать полное сканирование таблицы для запрашиваемой таблицы, если в предложении where или других фильтрах присоединения не найдется другой лучший дискриминатор.
Обновление: Это исправлено в EF / L2E v4 (.net 4.0), поэтому он генерирует SQL LIKE, как это делает L2S.

27 голосов
/ 07 мая 2009

Если вы используете VB.NET, ответ будет "*". Вот как выглядела бы ваша инструкция where ...

Where OH.Hierarchy Like '*/12/*'

Примечание: "*" Соответствует нулю или более символов. Вот статья msdn для оператора Like .

9 голосов
/ 04 октября 2011

ну у меня тоже работает indexOf

var result = from c in SampleList
where c.LongName.IndexOf(SearchQuery) >= 0
select c;
5 голосов
/ 08 августа 2016

Используйте такой код

try
{
    using (DatosDataContext dtc = new DatosDataContext())
    {
        var query = from pe in dtc.Personal_Hgo
                    where SqlMethods.Like(pe.nombre, "%" + txtNombre.Text + "%")
                    select new
                    {
                        pe.numero
                        ,
                        pe.nombre
                    };
        dgvDatos.DataSource = query.ToList();
    }
}
catch (Exception ex)
{
    string mensaje = ex.Message;
}
2 голосов
/ 16 сентября 2018

.NET ядро ​​теперь имеет EF.Functions.Like

2 голосов
/ 25 ноября 2016

Если вы не соответствуете числовым строкам, всегда хорошо иметь общий регистр:

.Where(oh => oh.Hierarchy.ToUpper().Contains(mySearchString.ToUpper()))
1 голос
/ 30 ноября 2018
System.Data.Linq.SqlClient.SqlMethods.Like("mystring", "%string")
1 голос
/ 16 февраля 2016

Я всегда так делаю:

from h in OH
where h.Hierarchy.Contains("/12/")
select h

Я знаю, что не использую оператор like, но он отлично работает в фоновом режиме, если это преобразовать в запрос с оператором like.

...