public async Task <List <Order> > PickOrderAsync(int count, DateTime at) { await BeginTransactionAsync(); var orders = await _context.Orders.ToArrayAsync(); var pickedCount = _context.Orders.Count(o => o.PickedAt > DateTime.MinValue); if (pickedCount > 0) { throw new BadRequestException("이미 추첨한 상태입니다."); } var managerIds = await _context.Users .Where(u => u.IsManager) .Select(u => u.Id) .ToListAsync(); var managers = await _context.Orders .Where(o => o.OrderedAt > at - OrderTolerance && o.OrderedAt < at) .Where(o => managerIds.Contains(o.UserId)) .ToListAsync(); var candidates = await _context.Orders .Where(o => o.OrderedAt > at - OrderTolerance && o.OrderedAt < at) .Where(o => !managerIds.Contains(o.UserId)) .ToListAsync(); var neededCount = Math.Max(count - managers.Count, 0); if (neededCount < candidates.Count) { candidates.Shuffle(); candidates = candidates.GetRange(0, neededCount); } if (managers.Count > 0) { managers.ForEach(o => o.PickedAt = at); _context.UpdateRange(managers); } if (candidates.Count > 0) { candidates.ForEach(o => o.PickedAt = at); _context.UpdateRange(candidates); } managers.AddRange(candidates); return(managers); }