您好我正在尝试使用.net mvc应用程序中的EF6从表中删除4-5k行
我正在使用RemoveRange,如果它的100-200行,它会在几秒钟内完成。但是当我尝试删除几千条记录时,需要很长时间(10分钟+)
using (someEntites dc = new someEntites())
{
var listForRemoval = (from a in dc.someTable
where a.Year == 2018 && a.month == 04
select a).ToList();
if (listForRemoval != null)
{
dc.someTable.RemoveRange(listForRemoval);
dc.SaveChanges();
}
}
我尝试禁用AutoDetectChangesEnabled,但这没有帮助。
是否还有其他(相对简单的)方法可以从db表中删除更大的数据块?
- p.s编写简单删除 - 在sql中需要一秒钟才能完成
答案 0 :(得分:2)
你可以尝试这样:
using (someEntites dc = new someEntites())
{
//var listForRemoval = (from a in dc.someTable
//where a.Year == 2018 && a.month == 04
//select a).ToList();
//if (listForRemoval?.Count > 0)
//{
//dc.someTable.RemoveRange(listForRemoval);
//dc.SaveChanges();
//}
dc.Database.ExecuteSqlCommand("DELETE FROM someTable " +
"WHERE Year = {0} " +
"AND month = {1}", 2018, 4);
// Executes a commande with parameters. You can add more parameters separated by ','.
}
如果与其他表有关系,则应单独删除它们。
答案 1 :(得分:1)
您可以尝试使用Entity Framework执行原始SQL查询。更多详情请见:
https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx
答案 2 :(得分:1)
您正在使用的方法并不是最好的方法,因为当您使用.ToList()然后删除时,您正在加载要在内存中删除的所有记录。想象一下,每个请求都会加载数千条记录。 这里要实现的是以下示例:
string statement= "DELETE FROM sometable WHERE year = 2018 AND month = 4";
dc.Database.SqlQuery(statement);
完整教程:http://www.entityframeworktutorial.net/entityframework4.3/raw-sql-query-in-entity-framework.aspx