我正在尝试删除EF5中的多行,而我正在使用以下代码示例
string TestId = "12,23";
Context.Database.ExecuteSqlCommand("DELETE FROM TEST WHERE TESTID IN (@Params)", new SqlParameter("Params", TestId));
如何为SqlParameter
传递IN
?我试图传递一串逗号分隔值
由于
答案 0 :(得分:0)
在SQL查询TESTID IN (...)
部分中传递动态数量值的唯一方法是使用子选择。这适用于SQL查询本身,因此没有可以解决您的问题的参数类型。
您可以选择使用字符串连接和每个参数的仔细验证来动态构建查询。
由于您正在使用ID,因此它们可能是整数。
List<int> testId = ...;
var sb = new StringBuilder();
sb.Append("DELETE FROM TEST WHERE TESTID IN (");
bool first = true;
foreach (var i in testId)
{
if (first)
first = false;
else
sb.Append(",");
sb.Append(i.ToString(CultureInfo.InvariantCulture));
}
sb.Append(")");
Context.Database.ExecuteSqlCommand(sb.ToString());
由于没有字符串参数附加到查询中,因此您无法进行任何SQL注入 - 整数不会包含恶意SQL代码。
当ID数量非常大时(通常在编译期间查询将因为太长而失败)的常用方法是创建临时表并在其中插入ID。
另一种方法是传入格式化为XML的值,并在SQL查询中编写一个从XML字符串中检索它们的子选择。