我在聚集索引上删除了大约5000行我的表,而EF需要将近30秒才能完成。
记录生成的SQL表明它正在为每一行执行一次删除:
DELETE [dbo].[Table]
WHERE ([ColumnID] = @0)
总共有5000笔交易。
我已尝试批量调用SaveChanges(),但这似乎不会提高性能,或改变上述行为。
//loop
{
//get batch
db.Table.RemoveRange(batch);
db.SaveChanges();
}
我已经看了一些其他问题,指出了每行执行删除命令的这个缺陷,但之后没有提出任何建议: How do I delete multiple rows in Entity Framework (without foreach)
有没有办法阻止EF每行执行一个命令?如果可能的话,我想避免使用内联SQL。
答案 0 :(得分:10)
不幸的是,这是frame
方法的正常行为。您可以在此post中查看答案以获取更多详细信息(请参阅引用文字)。
一个选项可能是使用EntityFramework Extended Library nuget包,它允许您创建批处理以在一次往返中删除行:
RemoveRange
如果您不想使用其他第三方库,则始终可以选择执行原始sql stamement:
//delete all rows where FirstName matches
db.Table
.Where(u => u.FirstName == "firstname")// just an example
.Delete();
但我认为你正在寻求第一个解决方案;)。