public async Task <List <FeaturedSlotItemModel> > GetFeaturedPoolSlotItems() { using (var context = DataContextFactory.CreateReadOnlyContext()) { var slotDetail = await context.PaytopiaPayments .AsNoTracking() .Where(x => x.PaytopiaItem.Type == PaytopiaItemType.FeaturedPool && x.Ends > DateTime.UtcNow) .GroupBy(x => x.ReferenceId) .ToListNoLockAsync().ConfigureAwait(false); var pools = await PoolReader.GetPools().ConfigureAwait(false); var results = new List <FeaturedSlotItemModel>(); foreach (var pool in pools.DistinctBy(x => x.Symbol)) { var isActive = false; var slotSummary = string.Empty; var existingSlotDetail = slotDetail.FirstOrDefault(x => x.Key == pool.Id); if (existingSlotDetail != null && existingSlotDetail.Any()) { isActive = existingSlotDetail.Any(x => x.Begins < DateTime.UtcNow.Date && DateTime.UtcNow.Date < x.Ends); slotSummary = string.Join(",", existingSlotDetail.Select(x => $"Week: {x.Begins.WeekOfYear()} ({x.Begins.ToString("dd/MM/yyyy")} - {x.Ends.ToString("dd/MM/yyyy")})")); } var nextFreeSlot = PaytopiaWriter.GetNextFreeSlot(pool.Id, slotDetail.FirstOrDefault(x => x.Key == pool.Id)); results.Add(new FeaturedSlotItemModel { Id = pool.Id, Name = pool.Symbol, IsFeatured = isActive, NextSlotWeek = nextFreeSlot.Begin.WeekOfYear(), NextSlotBegin = nextFreeSlot.Begin, NextSlotEnd = nextFreeSlot.End, SlotSummary = slotSummary }); } return(results); } }