public void FinalizeMaintenance(MaintenanceActual maintenance, DateTime end) { //Сохраняем дату завершения обслуживания maintenance.End = end; repository.Save(maintenance); var objectId = maintenance.Object.Id; //Найти интервалы объекта var intervals = query.FindMaintenanceIntervalsByObjectId(objectId); //Взять интересующий интервал по типу обслуживания var targetInterval = intervals.SingleOrDefault(x => x.MaintenanceType == maintenance.Type); if (targetInterval == null) { throw new Exception("Не найден интервал для данного вида обслуживания"); } /* Выбрать интервалы для сброса. Сюда попадает интересующий нас интервал и более мелкие. * Т.е. Если проводится Средний ремонт, то сбрасываются Средний, Текущий и Обслуживание. */ var intervalsForReset = intervals.Where(x => x.Quantity <= targetInterval.Quantity).ToDictionary(i => i.MaintenanceType, i => i); var last = query.FindLastMaintenanceByObjectId(objectId); last.ToList().ForEach(lm => { if (intervalsForReset.ContainsKey(lm.MaintenanceType)) { lm.Reset(end); repository.Save(lm); } }); }