Подтвердить что ты не робот

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) );

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

4b9b3361

Ответ 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.