使用RemoveRange()批量删除行

Pet*_*Han 22 c# entity-framework entity-framework-6

我试图从表中删除多行.

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

DELETE FROM Table
WHERE
    Table.Column = 'SomeRandomValue'
    AND Table.Column2 = 'AnotherRandomValue'
Run Code Online (Sandbox Code Playgroud)

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

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

以下是我的使用方法RemoveRange():

db.Tables.RemoveRange(
    db.Tables
        .Where(_ => _.Column == 'SomeRandomValue'
            && _.Column2 == 'AnotherRandomValue')
);
Run Code Online (Sandbox Code Playgroud)

Adi*_*Adi 6

我认为我们在这里达到了 EF 的限制。有时您只需要使用ExecuteSqlCommand来保持性能。


Jon*_*nan 5

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

存在多个支持此功能的库。

您可以在此处找到列表:实体框架批量删除库

免责声明:我是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);
Run Code Online (Sandbox Code Playgroud)

维基:EF+批量删除