带有int数组参数的EF ExecuteSqlCommand

ane*_*vil 4 arrays entity-framework asp.net-mvc-4

尝试使用类型数组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);
Run Code Online (Sandbox Code Playgroud)

方法2(也失败):

db.Database.ExecuteSqlCommand("delete from SupportRegion where UserId={0} and CategoryID not in ({1})", userItem.UserId, String.Join(",", userItem.ListItemId)); 
Run Code Online (Sandbox Code Playgroud)

如何将参数定义为整数数组?

非常感谢

Paw*_*wel 6

第一种情况不起作用,因为数据库不理解int数组的含义.我不知道第二个例子意味着什么"失败",但我想Sql Server无法将字符串转换为int.我相信在服务器端发生的事情是查询被转换为这样的东西(注意引号):

delete from SupportRegion where UserId={0} and CategoryID not in ('1, 2, 3')
Run Code Online (Sandbox Code Playgroud)

因为您传递的参数是一个字符串.但是,CategoryID列不是字符串,传递的参数不能转换为int.

我认为你可以尝试使用的是一个表值参数,但看起来设置它有点难看.

根据您删除的实体数量,最安全的可能是将实体带到客户端,将要删除的实体标记为已删除并调用SaveChanges().

另一个解决方法是正确设置命令文本(请参阅下面的免责声明):

db.Database.ExecuteSqlCommand(
     string.Format(
         "delete from SupportRegion where UserId={{0}} and CategoryID in ({0})", 
         String.Join(",",   userItem.ListItemId), 
      userItem.UserId)); 
Run Code Online (Sandbox Code Playgroud)

这样,string.format调用应该将您的int列表作为文本嵌入,然后将其传递给ExecuteSqlCommand方法,该方法将处理用户ID.

免责声明 上述方法可以被Sql Injection攻击利用.如果您不控制用于构建要删除的ID列表的数据源,请不要使用它.一般来说,我建议不要使用这种方法,除非你真的知道它是如何使用的,你确定没有什么不好的事情发生(你真的永远不会......)