Я пытаюсь выполнить, возможно, крупномасштабную операцию удаления для одной таблицы.(представьте 100 000 строк в таблице строк длиной 1 м)
Я использую 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.В настоящее время я выполняю сырой sql выше через EF Core.
Это приводит к паре вопросов:
- Есть ли способ заставить EF Core более эффективно удалять эти строки в Postgresиспользуя LINQ и т. д.?(Мне кажется, что, передавая контекст, запрашиваемый должен дать ему все необходимое для принятия правильного решения)
- Если нет, как вы относитесь к удалению в пакетах по сравнению с передачей БД только предиката?