/// <summary> /// will return intimidatorId summery and save result on _distributedCache /// </summary> /// <returns>List<IntimidatorWorkdayDto></returns> public async Task <List <IntimidatorWorkdayDto> > ReadAndCacheAsync() { var results = await _intimidatorWorkdayRepository.GetDailyWork(intimidatorId); var doors = await _doorRepository.SelectAsync(results.Select(d => d.DoorId).ToList()); var intimidator = await _intimidatorRepository.SelectAsync(intimidatorId, null); ILookup <DateTime, IntimidatorIntimidation> days = results .ToLookup(p => p.Day); List <IntimidatorWorkdayDto> workdays = new List <IntimidatorWorkdayDto>(); foreach (var day in days) { List <int> doorIds = days[day.Key].Select(d => d.DoorId).ToList(); List <int> doorIdsDepleted = days[day.Key].Where(d => d.Depleted).Select(d => d.DoorId).ToList(); var doorsForCurrentDay = doors.Where(door => doorIds.Contains(door.Id)).ToList(); var doorsDepletedForCurrentDay = doors.Where(door => doorIdsDepleted.Contains(door.Id)).ToList(); var workDayEnergy = doorsDepletedForCurrentDay.Sum(e => e.Energy); TimeSpan span = Time.GetSystemNow() - intimidator.StartToScareData; IntimidatorWorkdayDto workday = new IntimidatorWorkdayDto() { Doors = doorsForCurrentDay, Day = day.Key, DailyEnergy = workDayEnergy, GoalAccomplished = new CalculateEnergy(span.Days, workDayEnergy).IsWorkdayEnergyValid() }; workdays.Add(workday); } await _distributedCache.SetStringAsync(GetWorkdaysCacheKey(), JsonSerializer.Serialize(workdays)); return(workdays); }