public async Task Filter(long apprenticeshipId) { var apprenticeshipDataLocks = await _dataLockRepository.GetDataLocks(apprenticeshipId, true); if (apprenticeshipDataLocks == null || apprenticeshipDataLocks.Count == 0) { return; } var haveDuplicates = apprenticeshipDataLocks .GroupBy(x => new { x.IlrTrainingCourseCode, x.IlrTrainingType, x.IlrActualStartDate, x.IlrEffectiveFromDate, x.IlrTotalCost }) .Where(g => g.Count() > 1); foreach (var group in haveDuplicates) { var augustDataLock = group .Select(x => new { DataLockEventId = x.DataLockEventId, PriceEpisodeIdentifier = x.PriceEpisodeIdentifier, PriceEpisodeIdDateTime = x.GetDateFromPriceEpisodeIdentifier(), IsAugustPriceEpisode = _augustPricePeriodFormat.IsMatch(x.PriceEpisodeIdentifier) }) .OrderByDescending(x => x.PriceEpisodeIdDateTime).First(); if (!augustDataLock.IsAugustPriceEpisode) { var message = $"Unexpected price episode identifier matched: {augustDataLock.PriceEpisodeIdentifier} for apprenticeship: {apprenticeshipId}"; var exception = new AcademicYearFilterException(message); _logger.Error(exception, message); continue; } _logger.Info($"Found an academic year rollover data lock to delete: DataLockEventId: {augustDataLock.DataLockEventId}"); await _dataLockRepository.Delete(augustDataLock.DataLockEventId); } }