public Dictionary <DateTimeOffset, Scheduler> GetSchedulers(string barberId, List <DateTimeOffset> dates) { Dictionary <DateTimeOffset, Scheduler> result = new Dictionary <DateTimeOffset, Scheduler>(); //Fetch Bookings List <Bookings> bookings = _bookingRepository .GetBookingsByDates(barberId, dates, false, b => b.State == BookingConstants.Booked || b.State == BookingConstants.CheckedIn); Dictionary <DateTimeOffset, List <Bookings> > bookingDictionary = bookings.ClassifyToDictionary(booking => booking.BookedTime.GetDate()); //Fetch BarberSchedules Dictionary <DateTimeOffset, List <BarberSchedules> > barberScheduleDictionary = _scheduleRepository.GetSchedulesOfBarber(barberId, dates); dates.ForEach(date => { //Convert Bookings into Slot List <Slot> bookedSlots = bookingDictionary .GetValueOrDefault(date) ?.Select(booking => booking.ToSlot()) .ToList(); //Convert BarberSchedules into FreeTime List <FreeTime> freeTimes = barberScheduleDictionary .GetValueOrDefault(date) ?.Select(schedule => schedule.ToFreeTime(date)) .Where(freeTime => freeTime.YetToCome() || freeTime.OccursNow()) .ToList(); if (freeTimes == null) { return; } //Limit start time for current freetime var occursNow = freeTimes.Find(freeTime => freeTime.OccursNow()); if (occursNow != null) { var now = DateTimeUtil.GetTimeNow(); now = now.SetTime(now.Hour, now.Minute, 0); //Set second tick to 0 occursNow.Start = now.ToTimePoint(); } Scheduler scheduler = new Scheduler(freeTimes); scheduler.AddBookedSlots(bookedSlots); result.Add(date, scheduler); }); return(result); }