Предположим, что у вас есть идентификаторы категорий в целочисленном массиве, а Name - строка. Хитрость заключается в создании текста команды, позволяющего вводить все идентификаторы вашей категории в виде отдельных параметров и строить нечеткое соответствие имени. Чтобы сделать первый, мы используем цикл для построения последовательности имен параметров @ p0 через @ pN-1, где N - количество идентификаторов категории в массиве. Затем мы создаем параметр и добавляем его в команду с ассоциированным идентификатором категории как значение для каждого именованного параметра. Затем мы используем конкатенацию имени в самом запросе, чтобы разрешить нечеткий поиск по имени.
string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
1618, 1619, 1620, 1951, 1952,
1953, 1954, 1955, 1972, 2022 };
SqlCommand comm = conn.CreateCommand();
string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i++)
{
parameters[i] = "@p"+i;
comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",$"%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";
Это полностью параметризованный запрос, который должен сделать ваш администратор базы данных счастливым. Я подозреваю, что, поскольку они являются целыми числами, хотя это не было бы большим риском для безопасности, просто для того, чтобы напрямую строить текст команды со значениями, но все же параметризуя имя. Если ваши идентификаторы категорий находятся в массиве строк, просто разделите массив на запятые, преобразуйте их в целое и сохраните в массиве integer.
Примечание: Я говорю массив и использую его в примере, но он должен работать для любой коллекции, хотя ваша итерация, вероятно, будет отличаться.
Оригинальная идея от http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9
В "IN" clasule необходимо указать любое значение в команде SQL. И добавьте в таблицу «Параметры» добавку. Если вы передадите значение строки в SQL через значение параметра, вы не должны бояться за SQL-инъекцию. – TcKs 2008-11-19 20:08:06
Вы можете написать свой запрос как `WHERE name LIKE CONCAT ('%',?, '%')` – 2017-10-12 09:49:22