public OutageReport Generate(ReportOptions options) { List <Specification <OutageEntity> > specs = new List <Specification <OutageEntity> >(); if (options.ElementId.HasValue) { specs.Add(new OutageElementIdQuery(options.ElementId.Value)); } if (options.StartDate.HasValue) { specs.Add(new OutageStartDateQuery(options.StartDate.Value)); } if (options.EndDate.HasValue) { specs.Add(new OutageEndDateQuery(options.EndDate.Value)); } IEnumerable <OutageEntity> outages; if (specs.Count > 1) { AndSpecification <OutageEntity> andQuery = new AndSpecification <OutageEntity>(specs); outages = _outageRepository.Find(andQuery.IsSatisfiedBy).ToList(); } else if (specs.Count == 1) { outages = _outageRepository.Find(specs[0].IsSatisfiedBy).ToList(); } else { outages = _outageRepository.GetAll().ToList(); } var type = DateHelpers.GetType(options.StartDate, options.EndDate); var outageReportGrouping = outages.GroupBy(o => type == "Monthly" ? o.ReportTime.Month : o.ReportTime.Year).Select(o => o).ToList(); var reportData = new Dictionary <string, float>(); foreach (var outage in outageReportGrouping) { reportData.Add(type == "Monthly" ? DateHelpers.Months[outage.Key] : outage.Key.ToString(), outage.Count()); } return(new OutageReport { Type = type, Data = reportData }); }