EF Core Bulk Delete на PostgreSQL - PullRequest
       10

EF Core Bulk Delete на PostgreSQL

0 голосов
/ 28 января 2019

Я пытаюсь выполнить, возможно, крупномасштабную операцию удаления для одной таблицы.(представьте 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.

Это приводит к паре вопросов:

  1. Есть ли способ заставить EF Core более эффективно удалять эти строки в Postgresиспользуя LINQ и т. д.?(Мне кажется, что, передавая контекст, запрашиваемый должен дать ему все необходимое для принятия правильного решения)
  2. Если нет, как вы относитесь к удалению в пакетах по сравнению с передачей БД только предиката?

1 Ответ

0 голосов
/ 28 января 2019

Отказ от ответственности : я владелец проекта Entity Framework Plus

Ваш сценарий выглядит как нечто, что могут обрабатывать наши Batch Delete функции: https://entityframework -plus.net / batch-delete

Using (var db = new DbContext)
 var queryable = db.Table.AsQueryable()
       .Where(o => o.ForeignKey == fKey)
       .Where(o => o.OtherColumn == false);

queryable.Delete();

Объекты не загружены в приложение, и выполняется только SQL, как вы указали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...