0

我正在尝试删除 EF5 中的多行,并且正在使用以下代码示例

string TestId = "12,23";
Context.Database.ExecuteSqlCommand("DELETE FROM TEST WHERE TESTID IN (@Params)", new SqlParameter("Params", TestId));

我如何SqlParameter通过IN?我正在尝试传递一串以逗号分隔的值

谢谢

4

1 回答 1

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 字符串中检索它们的子选择。

于 2013-05-22T13:30:03.133 回答