Мы пытаемся реализовать оператор LIKE в Entity Framework для наших сущностей со строковыми полями, но, похоже, он не поддерживается. Кто-нибудь еще пробовал что-то подобное сделать?
В этом сообщении блога кратко описывается возникшая у нас проблема. Мы могли бы использовать contains, но это соответствует только самому тривиальному случаю LIKE. Объединение содержит, начинается с, заканчивается с и indexof приводит нас к этому, но требует перевода между стандартными подстановочными знаками и кодом Linq в Entities.
Ответы:
Это старый пост, но всем, кто ищет ответ, эта ссылка должна помочь. Перейдите к этому ответу, если вы уже используете EF 6.2.x. На этот ответ, если вы используете EF Core 2.x
Укороченная версия:
Метод SqlFunctions.PatIndex - возвращает начальную позицию первого вхождения шаблона в указанном выражении или нули, если шаблон не найден, для всех допустимых текстовых и символьных типов данных.
Пространство имен: System.Data.Objects.SqlClient Сборка: System.Data.Entity (в System.Data.Entity.dll)
Небольшое объяснение также появляется в этой ветке форума .
источник
На самом деле я ничего не знаю об EF, но в LINQ to SQL вы обычно выражаете предложение LIKE с помощью String.Contains:
переводится на
(Используйте
StartsWith
иEndsWith
для другого поведения.)Я не совсем уверен, полезно ли это, потому что я не понимаю, что вы имеете в виду, когда говорите, что пытаетесь реализовать LIKE. Если я полностью не понял, дайте мне знать, и я удалю этот ответ :)
источник
У меня такая же проблема.
На данный момент я остановился на фильтрации подстановочных знаков / регулярных выражений на стороне клиента на основе http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx - это просто и работает как ожидается.
Я нашел еще одно обсуждение этой темы: http://forums.asp.net/t/1654093.aspx/2/10
Этот пост выглядит многообещающим, если вы используете Entity Framework> = 4.0:
Примечание: это решение предназначено только для SQL-Server, поскольку оно использует нестандартную функцию PATINDEX.
источник
Обновление: в EF 6.2 есть оператор Like
источник
Where(obj => DbFunctions.Like(obj.Column , "%expression%")
:?Там находится
LIKE
оператор добавляется вEntity Framework Core 2.0
:var query = from e in _context.Employees where EF.Functions.Like(e.Title, "%developer%") select e;
Сравнение с
... where e.Title.Contains("developer") ...
этим действительно переводится,SQL
LIKE
а неCHARINDEX
мы видимContains
метод.источник
Это специально упоминается в документации как часть Entity SQL. Вы получаете сообщение об ошибке?
// LIKE and ESCAPE // If an AdventureWorksEntities.Product contained a Name // with the value 'Down_Tube', the following query would find that // value. Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name LIKE 'DownA_%' ESCAPE 'A' // LIKE Select value P.Name FROM AdventureWorksEntities.Product as P where P.Name like 'BB%'
http://msdn.microsoft.com/en-us/library/bb399359.aspx
источник
если вы используете MS Sql, я написал 2 метода расширения для поддержки символа% для поиска по шаблону. (Требуется LinqKit)
Применение
в ef6, и он должен переводиться на
', @ p__linq__0 ='% He% llo% ', @ p__linq__1 ='% Hi% ', @ p__linq_2 ='% Active '
источник
Для EfCore вот пример построения выражения LIKE
источник
Вы можете легко использовать настоящий лайк в Link to Entities
Добавить
к вашему EDMX в этом теге:
Также запомните пространство имен в
<schema namespace="" />
атрибутеЗатем добавьте класс расширения в указанное выше пространство имен:
Этот метод расширения теперь будет отображаться на функцию EDMX.
Подробнее здесь: http://jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
источник