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


Как я могу сделать это возможным при определении параметра как массива целых чисел?



Большое спасибо

576   1  

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

    Ничего не найдено.