Вот 2 варианта:
- Использование метода SqlMethods.Like (рекомендуется)
- Использование метода AsEnumerable для извлечения записей и использования регулярных выражений или чего-либо подобного на стороне клиента в памяти (дороже)
Переходя к варианту № 1 выше, вы можете сделать что-то вроде этого:
string searchTerm = "abccamp";
string pattern = "%"
+ String.Join("%", searchTerm.Select(c => c.ToString()).ToArray())
+ "%";
var query = from x in y
where SqlMethods.Like(x, pattern)
select x;
Адаптируя его к вашему запросу, вы, вероятно, будете использовать что-то похожее на SqlMethods.Like(p.Product_Name, pattern)
вместо p.Product_Name.ToLower().Contains(text.ToLower())
.
РЕДАКТИРОВАТЬ: , как упомянуто в комментариях, этот подход может не дать точных результатов, так как между каждым символом существует подстановочный знак, чтобы заменить специальные символы. Другой возможный подход - использовать _
вместо %
для учета одного символа. Недостатком является то, что у вас может быть несколько специальных символов подряд, и для повторений потребуется подстановочный знак, что возвращает нас к тому, с чего мы начали. С SqlMethods.Like
вы можете использовать те же вещи, что и для TSQL LIKE . Это включает в себя классы символов с диапазонами и классы отрицанных символов, так что вы также можете использовать [!/@ ]
вместо %
в String.Join
.
Проблема с использованием _
заключается в том, что вы не можете сделать один символ необязательным, как если бы вы использовали регулярное выражение. Шаблон a_b_c_d
не соответствует «abcd», так как каждый _
должен соответствовать символу между каждой буквой. Другими словами, это будет соответствовать "a! B $ c @ d". Возможно, вы можете использовать оба в предложении where
: ... where x == searchTerm || SqlMethods.Like(x, pattern)
, где pattern
такое же, как и раньше, но с использованием _
вместо %
в методе String.Join
.
Кроме того, убедитесь, что у вас есть некоторая логика if / else, проверяющая searchTerm
, чтобы определить, что делать, если ввод пуст или состоит из одного символа, который даст %x%
и может быть нежелательным и соответствовать многим строки.