public async Task EnforceMaxCapacity() { var memeSizePairs = await _databaseContext.Memes.OrderBy(m => m.Created) .Select(m => new { Id = m.Id, ThreadId = m.ThreadId, Size = m.FileSize }).ToListAsync(); var sum = memeSizePairs.Sum(m => (long)m.Size); var toDelete = new List <long>(); foreach (var memeSizePair in memeSizePairs) { if (sum < _maxCapacityBytes) { break; } try { await _fileStorageService.Delete($"meme{memeSizePair.Id}.webm"); await _fileStorageService.Delete($"meme{memeSizePair.Id}.jpeg"); sum -= memeSizePair.Size; toDelete.Add(memeSizePair.Id); } catch (Exception) { _logger.LogError("Could not delete meme {MemeId}", memeSizePair.Id); toDelete.Remove(memeSizePair.Id); } } var memesToDelete = await _databaseContext.Memes.Where(m => toDelete.Contains(m.Id)).ToListAsync(); _databaseContext.RemoveRange(memesToDelete); await _databaseContext.SaveChangesAsync(); _logger.LogInformation("Deleted {DeletedMemes} memes", memesToDelete.Count); }