2013-05-22 86 views
0

我试图删除EF5多行,我用下面的代码示例实体框架中删除多行

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

我如何通过SqlParameterIN?我试图通过逗号分隔值

感谢

回答

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

+1

所以最好我可以删除使用LINQ到实体而不是这种方式?为了避免我使用这个。有什么建议么 ? – Peru

+0

我通常只在有大量要删除的实体时才这样做。传统的EF方法需要一个SELECT,然后是DELETE。你可能会首先看到'Context.Tests.Local.FirstOrDefault(o => o.id == x)'返回null('.Local'只包含已经存在于内存中的对象) - 如果没有,则使用EF删除,否则直接在SQL中删除。 –