使用RemoveRange()批量删除行

我试图从表中删除多行。

在常规SQL Server中,这很简单,如下所示:

DELETE FROM Table WHERE Table.Column = 'SomeRandomValue' AND Table.Column2 = 'AnotherRandomValue' 

在Entity Framework 6中,他们引入了RemoveRange()方法。
但是,当我使用它时,entity framework不是使用我提供的where子句删除行,而是查询数据库以获取与where子句匹配的所有行,并使用其主键逐个删除它们。

这是EntityFramework的当前限制吗? 或者我使用RemoveRange()错误?

以下是我如何使用RemoveRange()

 db.Tables.RemoveRange( db.Tables .Where(_ => _.Column == 'SomeRandomValue' && _.Column2 == 'AnotherRandomValue') ); 

我想我们达到了EF的限制。 有时你只需要使用ExecuteSqlCommand来保持高效 。

您正在寻找的是批量删除库,它从LINQ查询中删除数据库中的多个记录而不加载实体。

存在支持此function的多个库。

您可以在此处找到列表: entity framework批量删除库

免责声明 :我是项目Entity Framework Plus的所有者

 // using Z.EntityFramework.Plus; // Don't forget to include this. // DELETE directly in SQL (without loading entities) db.Tables.Where(_ => _.Column == 'SomeRandomValue' && _.Column2 == 'AnotherRandomValue') .Delete(); // DELETE using a BatchSize db.Tables.Where(_ => _.Column == 'SomeRandomValue' && _.Column2 == 'AnotherRandomValue') .Delete(x => x.BatchSize = 1000); 

维基: EF +批量删除

它有点破,试试吧

 db.Tables.RemoveRange( db.Tables .Where(_ => _.Column == 'SomeRandomValue' && _.Column2 == 'AnotherRandomeValue').AsEnumerable().ToList() ); db.SaveChanges(); 
 var db1 = db.Tables .Where(_ => _.Column == 'SomeRandomValue' && _.Column2 == 'AnotherRandomeValue').AsEnumerable().ToList(); db.Tables.RemoveRange(db1); db.SaveChanges(); 

使用变量存储可移动列表并将其传递给RemoveRange()。

我通常喜欢这样,那就是工作。 希望这也适用于您的情况。

为什么不只是有一个适配器到数据库,只是发送适当的删除命令,如你的例子?

退一步思考。 你真的想从数据库下载记录以删除它们吗? 仅仅因为你可以做到这一点并不是一个好主意。

也许您可以考虑使用存储过程从数据库中删除项目? EF也允许这样做……

我自己正在处理这个问题,并同意Adi – 只需使用sql。

我正在清理日志表中的旧行,EF RemoveRange花了3分钟做了同样的事情,这在3秒内完成了:

 DELETE FROM LogEntries WHERE DATEDIFF(day, GETDATE(), Date) < -6 

Date是包含日期的列的名称。 要使其正确,请使用参数,当然,如下所示:

  context.Database.ExecuteSqlCommand ("DELETE FROM LogEntries WHERE DATEDIFF(day, GETDATE(), Date) < @DaysOld", new System.Data.SqlClient.SqlParameter( "DaysOld", - Settings.DaysToKeepDBLogEntries)); 

请注意,我的案例涉及很多行。 当我启动项目并且没有大量数据时,RemoveRange工作正常。