Линк к сущностям (EF 4.1): Как сделать SQL LIKE с подстановочным знаком в середине («% term% term%»)? - PullRequest
17 голосов
/ 07 октября 2011

Я хочу найти это:

Post Cereal

и получить это:

Post Honey Nut Cereal

где подстановочные знаки будут пробелами.

Я знаю, что ямог бы выполнить SPLIT и серию AND и Contains () и преобразовать их в выражение Linq для каждого термина в качестве объекта спецификации, но нет ли способа использовать символы подстановки в термине, отправленном в SQL?Я посмотрел на функции SQL, где он находится в Linq to SQL, но я не уверен, что это в Linq to Entities.

Я хотел бы сделать что-то вроде этого:

term = '%' + term.Replace(' ', '%') + '%';
db.table.where( p => System.Data.Objects.SqlClient.SqlFunctions
                     .SqlMethods.Like(p.fieldname, term) );

Любойпредложения?

Ответы [ 3 ]

44 голосов
/ 07 октября 2011

Полагаю, вы могли бы использовать SqlFunctions.PatIndex :

dt.Table.Where(p => SqlFunctions.PatIndex(term, p.fieldname) > 0);

SqlFunctions.PatIndex ведет себя так же, как оператор SQL LIKE .Он поддерживает все стандартные символы подстановки, включая:

  • % Любая строка из нуля или более символов.
  • _ (подчеркивание) Любой одиночныйсимвол.
  • [] Любой отдельный символ в указанном диапазоне ([af]) или набор ([abcdef]).
  • [^] Любой отдельный символ, находящийся за пределами указанного диапазона ([^ af]) или набора ([^ abcdef]).

SqlFunctions.PatIndex часто доступен, когда SqlMethods.Like недоступен (в том числе в пределахКонтроллеры MVC)

5 голосов
/ 07 октября 2011

Вероятно, проще обойти 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.

0 голосов
/ 08 октября 2014

Просто чтобы уточнить комментарий Ладислава относительно 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.

...