C# 删除实体框架中的多行

C# 删除实体框架中的多行,c#,entity-framework-5,sqlparameter,C#,Entity Framework 5,Sqlparameter,我正在尝试删除EF5中的多行,并使用以下代码示例 string TestId = "12,23"; Context.Database.ExecuteSqlCommand("DELETE FROM TEST WHERE TESTID IN (@Params)", new SqlParameter("Params", TestId)); 如何在中为传递SqlParameter?我试图传递一个逗号分隔的值字符串 谢谢在SQL查询中传递动态数值的唯一方法是使用子选择。这适用于SQL查询本身,因此没有参

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

string TestId = "12,23";
Context.Database.ExecuteSqlCommand("DELETE FROM TEST WHERE TESTID IN (@Params)", new SqlParameter("Params", TestId));
如何在中为
传递
SqlParameter
?我试图传递一个逗号分隔的值字符串


谢谢

在SQL查询中传递动态数值的唯一方法是使用子选择。这适用于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());
List testId=。。。;
var sb=新的StringBuilder();
sb.追加(“删除测试中的测试(”);
bool first=true;
foreach(testId中的变量i)
{
如果(第一)
第一个=假;
其他的
某人加上(“,”);
sb.Append(i.ToString(CultureInfo.InvariantCulture));
}
某人加上(“)”;
Context.Database.ExecuteSqlCommand(sb.ToString());
由于查询中没有附加任何字符串参数,因此可以避免任何SQL注入—整数不可能包含恶意SQL代码

当ID的数量非常大时,通常的方法是创建一个临时表并在其中插入ID(因此查询在编译过程中会因为太长而失败)


另一种方法是传入格式化为XML的值,并在SQL查询中编写一个子选择,从XML字符串中检索这些值。

因此,我最好使用linq to实体来删除,而不是这样?为了避免foreach,我用了这个。有什么建议吗?我通常只在有大量实体需要删除时才这样做。经典的EF方法要求先选择,然后删除。您可能首先看到
Context.Tests.Local.FirstOrDefault(o=>o.id==x)
是否返回
null
.Local
仅包含内存中已存在的对象)-如果不是,请使用EF删除,否则直接在SQL中删除。