Linq to Entities (EF 4.1): как сделать SQL LIKE с подстановочным знаком в середине ( "% term% term%" )?
Я хочу найти это:
Post Cereal
и получите следующее:
Post Honey Nut Cereal
где дикими картами будут пробелы.
Я знаю, что я мог бы сделать SPLIT и ряд AND и Contains() и преобразовать в выражение Linq для каждого термина как объект спецификации, но разве нет способа почтить подстановочные знаки в терминах, отправленных на SQL? Я посмотрел на функции SQL, где это в Linq на SQL, но я не уверен, что это в Linq для Entities.
Я хотел бы сделать что-то вроде этого:
term = '%' + term.Replace(' ', '%') + '%';
db.table.where( p => System.Data.Objects.SqlClient.SqlFunctions
.SqlMethods.Like(p.fieldname, term) );
Любые предложения?
Ответы
Ответ 1
Я считаю, что вы можете использовать SqlFunctions.PatIndex:
dt.Table.Where(p => SqlFunctions.PatIndex(term, p.fieldname) > 0);
SqlFunctions.PatIndex ведет себя так же, как оператор SQL LIKE. Он поддерживает все стандартные подстановочные знаки, включая:
- % Любая строка из нуля или более символов.
- _ (подчеркивание) Любой отдельный символ.
- [] Любой отдельный символ в указанном диапазоне ([a-f]) или set ([abcdef]).
- [^] Любой одиночный символ не в указанном диапазоне ([^ a-f]) или set ([^ abcdef]).
SqlFunctions.PatIndex часто доступен, когда SqlMethods.Like недоступен (в том числе внутри контроллеров MVC)
Ответ 2
Возможно, проще обойти LINQ и использовать фильтр Entity SQL:
var query - db.table.Where("TRIM(fieldname) LIKE @pattern");
query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"
а тип query
реализует IQueryable<TEntity>
, чтобы вы могли применить дальнейшие операторы LINQ.
Ответ 3
Просто, чтобы прояснить комментарий Ладислава относительно it.BusinessName
. Я думаю, что он имеет в виду префикс имени поля .it
. Вышеупомянутое решение работает до тех пор, пока вы префиксное имя поля в предложении where с it.
. Также мне не нужен TRIM() в моем случае.
var query - db.table.Where("it.fieldname LIKE @pattern");
query.Parameters.Add(new ObjectParameter("pattern", term)); // term == "%what%ever%"
Он отлично работал с базой данных Oracle.