private IEnumerable <EventMilestoneInfo> GetFilteredEventMilestones(IEnumerable <EventMilestoneInfo> eventMilestones, EventMilestoneFilterInputInfo eventMilestoneFilterInputInfo)
        {
            var eventMilestoneInfos     = eventMilestones as IList <EventMilestoneInfo> ?? eventMilestones.ToList();
            var filteredEventMilestones = new List <EventMilestoneInfo>();

            if ((!string.IsNullOrEmpty(eventMilestoneFilterInputInfo.EventMilestoneDescription)) || (!string.IsNullOrEmpty(eventMilestoneFilterInputInfo.EventForTargetDescription)))
            {
                foreach (var eventMilestoneInfo in eventMilestoneInfos)
                {
                    if (!string.IsNullOrEmpty(eventMilestoneFilterInputInfo.EventMilestoneDescription))
                    {
                        if (eventMilestoneInfo.EventMilestoneDescription.ToLower().Contains(eventMilestoneFilterInputInfo.EventMilestoneDescription.ToLower()))
                        {
                            filteredEventMilestones.Add(eventMilestoneInfo);
                        }
                    }
                    if (!string.IsNullOrEmpty(eventMilestoneFilterInputInfo.EventForTargetDescription))
                    {
                        if (eventMilestoneInfo.EventForDateReferenceForTarget != null && eventMilestoneInfo.EventForDateReferenceForTarget.ToLower().Contains(eventMilestoneFilterInputInfo.EventForTargetDescription.ToLower()))
                        {
                            filteredEventMilestones.Add(eventMilestoneInfo);
                        }
                    }
                }
                return(filteredEventMilestones);
            }
            return(eventMilestoneInfos);
        }
        public IEnumerable <EventMilestoneInfo> GetEventMilestones(ListInputInfo listInputInfo, EventMilestoneFilterInputInfo eventMilestoneFilterInputInfo)
        {
            var sourceEvents = _sourceRepository.Get(
                sourceEvent => string.IsNullOrEmpty(eventMilestoneFilterInputInfo.ParentEventDescription) || sourceEvent.SourceName.Description.Contains(eventMilestoneFilterInputInfo.ParentEventDescription),
                sourceEvent => sourceEvent.SourceName,
                sourceEvent => sourceEvent.NextPossibleEvents.Select(d => d.DestinationName),
                sourceEvent => sourceEvent.NextPossibleEvents.Select(d => d.EventForDateReferenceForTarget));

            var eventMilestones = from sourceEvent in sourceEvents
                                  let nextPossibleEvents = sourceEvent.NextPossibleEvents
                                                           from nextEvent in nextPossibleEvents
                                                           orderby listInputInfo
                                                           select new EventMilestoneInfo
            {
                EventMilestoneId               = nextEvent.Id,
                IsMandatory                    = nextEvent.IsMandatory,
                EventMilestoneDescription      = nextEvent.DestinationName.Description,
                ParentEventDescription         = sourceEvent.SourceName.Description,
                TargetNumberOfDays             = nextEvent.TargetNumberOfDays,
                EventForDateReferenceForTarget = nextEvent.EventForDateReferenceForTarget != null ? nextEvent.EventForDateReferenceForTarget.Description : null,
                ClockType = nextEvent.ClockType
            };

            var filteredEventMilestones = GetFilteredEventMilestones(eventMilestones, eventMilestoneFilterInputInfo);

            return(GetOrderedEventMilestones(filteredEventMilestones, listInputInfo));
        }