我使用的是PostgreSQL和EntityFrameworkCore。
具体细节:应用程序代码有一个用于匹配的谓词,并且对可能匹配谓词的行数一无所知。它可能是0行或非常大量的行。
研究表明,EF Core无法有效处理此操作。(例如,以下代码会为每行生成一个删除语句!)
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。
这引出了几个问题:
- 是否有任何方法可以使用LINQ等在Postgres上更有效地删除这些行? (我认为将可查询的查询传递给上下文应该能够提供所有必要的信息以做出正确的决策)
- 如果不行,您对分批删除与仅向数据库提供谓词的做法有何看法?