删除Entity Framework中的多个行

时间:2013-05-22 13:21:54

标签: c# entity-framework-5 sqlparameters

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

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

如何为SqlParameter传递IN?我试图传递一串逗号分隔值

由于

1 个答案:

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