NikFaraday
@NikFaraday
Student full-stack Developer

Как сделать Bulk update методами LINQ (Entity Framework Core) дополнительной таблицы при связи много-ко-многим?

Есть две таблицы Pharmacies и Products, которые связаны связью много-ко-многим. Пытаюсь сделать метод для обновления дополнительной таблицы PharmacyProductsEntity методом ExecuteUpdate, но не могу понять, как правильно построить такой запрос. Проблема в том, что не все методы могут транслироваться в SQL запрос.

Вот код, который я смог собрать:

public async Task ApplyRange(Guid pharmacyId, IEnumerable<(Guid id, int count)> products)
{
    await _table
    .Where(entity => entity.PharmacyId == pharmacyId && products.Where(p => p.id == entity.ProductId).Any())
    .ExecuteUpdateAsync(entity => entity.SetProperty(x => x.Count, x => x.Count + products.First(p => p.id == x.ProductId).count));
}


К сведению, используется Entity Framework Core 8.
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Для данного случая предлагаю update в цикле, обернутую в транзакцию.
Так как даже в SQL такое не выразить

Примерно так
public async Task ApplyRange(Guid pharmacyId, IEnumerable<(Guid id, int count)> products)
{
    await _table.BeginTransactionAsync();
    for (var (id, count) in products)
    {
          await _table.Where(e => e.PharmacyId == pharmacyId && e.ProductId == id)
                              .ExecuteUpdateAsync(entity => entity.SetProperty(x => x.Count, x => x.Count + count))
    }
    await _table.CommitTransactionAsync();
}


Единственная проблема здесь в множественных RTT при каждом запросе, но все нивилируется тем, что выполняется в транзакции, т.е. большая задержка будет при коммите. Но рекомендую найти какую-нибудь либу, которая будет батчить подобные операции

P.S.
1. Есть CreateExecutionStrategy, который и реализует семантику транзакции
2. Код писал здесь в редакторе, поэтому может даже не компилироваться - главная задача дать идею
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы