Как я могу улучшить эффективность этого кода?
Сконфигурируйте вашу базу данных для реализации каскадного удаления в ограничении внешнего ключа между пользователем и UserRole, а затем из EF вы можете просто удалить пользователя.
См. Каскадное удаление - EF Core
И вы можете удалить объект без предварительного запроса. Просто создайте экземпляр сущности со свойствами ключа и присоедините его к DbContext в изолированном состоянии.
Ваш контроллер может быть простым:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
using (var db = new Db())
{
db.Users.Remove(new User() { Id = deleteDto.id });
await db.SaveChangesAsync(cancellationToken);
}
return Ok();
}
Без каскадного удаления единственный эффективный способ сделать это с помощью команд хранилища. EG:
public async Task<ReturnResult> DeleteUser(DeleteDto deleteDto, CancellationToken cancellationToken)
{
using (var db = new Db())
using (var tran = db.Database.BeginTransaction())
{
await db.Database.ExecuteSqlCommandAsync("delete from UserRole where UserId = @id", cancellationToken, deleteDto.id);
await db.Database.ExecuteSqlCommandAsync("delete from User where UserId = @id", cancellationToken, deleteDto.id);
tran.Commit();
}
return Ok();
}