EF ExecuteSqlCommand с параметром int array
У меня возникла проблема при попытке передать параметр с типом array of int. То, что я сделал до сих пор ниже, но оба метода потерпели неудачу.
Метод 1 (Не Удалось) :
int[] CategoryArray;
CategoryArray = new int[userItem.ListItemId.Count()];
int i=0;
foreach (int catID in userItem.ListItemId)
{
CategoryArray[i] = catID;
i++;
}
db.Database.ExecuteSqlCommand("delete from SupportRegion where UserId={0} and CategoryID not in ({1})", userItem.UserId, CategoryArray);
Метод 2 (также не удалось) :
db.Database.ExecuteSqlCommand("delete from SupportRegion where UserId={0} and CategoryID not in ({1})", userItem.UserId, String.Join(",", userItem.ListItemId));
Как я могу сделать это возможным при определении параметра как массива целых чисел?
Большое спасибо
1 ответ:
Первый случай не будет работать, так как база данных не понимает, что означает массив int. Я не знаю, что означает" failed " во 2-м Примере, но я предполагаю, что Sql Server не может преобразовать строку в int. Я считаю, что на стороне сервера происходит то, что запрос преобразуется в нечто вроде этого (обратите внимание на кавычки):
delete from SupportRegion where UserId={0} and CategoryID not in ('1, 2, 3')Поскольку параметр, который вы передаете, является строкой. Однако столбец CategoryID не является строкой, передаваемый параметр не может быть преобразован в int.
Я думаю, что вы могли бы попробовать использовать параметр табличного значения, но это выглядит как установка его немного уродливо.
В зависимости от того, сколько объектов вы удаляете, самым безопасным может быть принести объекты клиенту, отметьте те, которые вы хотите удалить, как удаленные и вызовите SaveChanges().
Еще один способ обойти это настроить текст команды правильно (смотрите отказ от ответственности ниже):
db.Database.ExecuteSqlCommand( string.Format( "delete from SupportRegion where UserId={{0}} and CategoryID in ({0})", String.Join(",", userItem.ListItemId), userItem.UserId));Таким образом строка.вызов формата должен встроить ваш список int в виде текста, а затем передать его в метод ExecuteSqlCommand, который будет заботиться о идентификаторе пользователя.
Отказ от ответственности Вышеуказанный метод может быть использован SQL-инъекции. никогда не используйте его, если вы не контролируете источник данных, используемых для построения списка идентификаторов, подлежащих удалению. В общем, я бы рекомендовал не использовать этот метод, если вы действительно не знаете, как он используется, и вы уверены, что ничего плохого не произойдет (чего на самом деле никогда не будет...)
Comments