public IEnumerable <AggregatedRaceResult> GetRaceResults(int id, string regioncode)
        {
            var result = new List <AggregatedRaceResult>();

            try
            {
                if (String.IsNullOrEmpty(regioncode) ||
                    (regioncode.ToUpper() == "ALL") ||
                    (regioncode.ToUpper() == "NGA"))
                {
                    result = (List <AggregatedRaceResult>)_raceResultRepository.GetAggregatedRaceResults(id, null);
                    result = result.GroupBy(r => r.PartyAcronym)
                             .Select(r =>
                    {
                        AggregatedRaceResult aggregatedRaceResult = r.FirstOrDefault();
                        return(new AggregatedRaceResult
                        {
                            PartyAcronym = r.Key,
                            RegionID = aggregatedRaceResult.RegionID,
                            RegionCode = "ALL",
                            //RegionName = r.FirstOrDefault().RegionName,
                            RaceID = aggregatedRaceResult.RaceID,
                            CandidateId = aggregatedRaceResult.CandidateId,
                            FirstName = aggregatedRaceResult.FirstName,
                            LastName = aggregatedRaceResult.LastName,
                            MiddleName = aggregatedRaceResult.MiddleName,
                            PartyName = aggregatedRaceResult.PartyName,
                            PartyColor = aggregatedRaceResult.PartyColor,
                            TotalVotes = r.Sum(p => p.TotalVotes),
                        });
                    }).ToList();
                }
                else
                {
                    result = (List <AggregatedRaceResult>)_raceResultRepository.GetAggregatedRaceResults(id, regioncode);
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return(result);
        }
        public ActionResult RaceResults(RaceResultsViewModel viewModel)
        {
            try
            {
                var regionalResults = new List <RegionResultViewModel>();
                var overallResults  = new RegionResultViewModel();

                //get all results for the given race
                var allRegionsResults = raceResultsService.GetAggregatedRaceResults(viewModel.RaceID, null).ToList();
                var regions           = raceResultsService.GetRegions().Where(r => r.TopLevel == true).ToList(); //get all toplevel regions
                Mapper.CreateMap <Models.AggregatedRaceResult, ViewModels.AggregatedRaceResultViewModel>();
                //get result per region
                foreach (var region in regions)
                {
                    var regionresult = new RegionResultViewModel();
                    regionresult.Region = new RegionViewModel {
                        RegionID = region.RegionID, RegionCode = region.RegionCode, Name = region.Name
                    };
                    regionresult.Results = Mapper.Map <List <Models.AggregatedRaceResult>, List <ViewModels.AggregatedRaceResultViewModel> >
                                               (allRegionsResults.Where(rr => rr.RegionCode.ToLower() == region.RegionCode.ToLower()).ToList());
                    regionresult.Winner = regionresult.Results.OrderByDescending(rr => rr.TotalVotes).FirstOrDefault();
                    regionalResults.Add(regionresult);
                }

                // overall results
                // aggregate for all regions
                var aggResults = allRegionsResults.GroupBy(r => r.PartyAcronym)
                                 .Select(r =>
                {
                    AggregatedRaceResult aggregatedRaceResult = r.FirstOrDefault();
                    return(new
                    {
                        PartyAcronym = r.Key
                        , aggregatedRaceResult.RegionID
                        , aggregatedRaceResult.RegionCode
                        , aggregatedRaceResult.RegionName
                        , aggregatedRaceResult.RaceID,
                        CandidateID = aggregatedRaceResult.CandidateId, aggregatedRaceResult.FirstName, aggregatedRaceResult.LastName, aggregatedRaceResult.MiddleName, aggregatedRaceResult.PartyName, aggregatedRaceResult.PartyColor,
                        TotalVotes = r.Sum(p => p.TotalVotes),
                    });
                }).ToList();

                overallResults.Results = new List <AggregatedRaceResultViewModel>();
                foreach (var aggResult in aggResults)
                {
                    overallResults.Results.Add(new AggregatedRaceResultViewModel
                    {
                        PartyAcronym = aggResult.PartyAcronym,
                        RegionID     = aggResult.RegionID,
                        RegionCode   = aggResult.RegionCode,
                        RegionName   = aggResult.RegionName,
                        RaceID       = aggResult.RaceID,
                        CandidateID  = aggResult.CandidateID,
                        TotalVotes   = aggResult.TotalVotes.Value,
                        FirstName    = aggResult.FirstName,
                        LastName     = aggResult.LastName,
                        MiddleName   = aggResult.MiddleName,
                        PartyName    = aggResult.PartyName,
                        PartyColor   = aggResult.PartyColor,
                    });
                }

                var allResults = new RaceResultsViewModel
                {
                    RegionalResults       = regionalResults,
                    SelectedRegionResults = string.IsNullOrEmpty(viewModel.RegionCode)
                                            ? overallResults
                                            : regionalResults.FirstOrDefault(rr => rr.Region.RegionCode == viewModel.RegionCode)
                };


                return(Json(allResults, JsonRequestBehavior.AllowGet));
            }
            catch (Exception ex)
            {
                return(Json(new { Message = ex.Message, StackTrace = ex.StackTrace, InnerException = ex.InnerException.Message }));
            }
        }