【发布时间】:2019-06-20 23:29:34
【问题描述】:
我正在尝试对单个表执行潜在的大规模删除操作。 (想想 1m 行表上的 100,000 行)
我正在使用 PostgreSQL 和 EntityFrameworkCore。
详细信息:应用程序代码有一个要匹配的谓词,并且不知道有多少行可能匹配该谓词。它可能是 0 行/秒或非常大的数量。
研究表明 EF Core 无法有效处理此问题。 (即以下代码为每一行生成一个 Delete 语句!)
Using (var db = new DbContext)
var queryable = db.Table.AsQueryable()
.Where(o => o.ForeignKey == fKey)
.Where(o => o.OtherColumn == false);
db.Table.RemoveRange(queryable);
await db.SaveChangesAsync();
所以这是我希望在某种批处理操作中运行的 SQL:
delete from Table
where ForeignKey = 1234
and OtherColumn = false
and PK in (
select PK
from Table
where ForeignKey = 1234
and OtherColumn = false
limit 500
)
那里有扩展库,但我还没有找到支持 Postgres 的活跃库。我目前正在通过 EF Core 执行上面的原始 sql。
这引出了几个问题:
- 有没有办法让 EF Core 使用 LINQ 等在 Postgres 上更有效地删除这些行? (在我看来,就像将可查询的上下文交给它应该给它在这里做出正确决定所需的一切)
- 如果不是,您对批量删除与仅将谓词交给数据库有何看法?
【问题讨论】:
标签: postgresql entity-framework-core