private ActionResult ShowIndex(int? id, bool under17s, bool showAll) { var model = new OrderOfMerit(); model.Under17s = under17s; model.ShowAll = showAll; Season selectedSeason; if (id.HasValue) selectedSeason = db.Seasons.Find(id); else selectedSeason = db.Seasons.First(); model.SelectedSeasonId = selectedSeason.Id; model.Seasons = new SelectList(db.Seasons, "Id", "SeasonName", selectedSeason.Id); var events = db.Events.Include("EventTeamEntries.EventRiderEntries.Rider").Where(e=>e.SeasonID == selectedSeason.Id).OrderBy(e => e.EventDate).ToArray(); model.Events = events.OrderBy(e=>e.EventDate).Select(e => e.EventName).ToArray(); model.EventCount = model.Events.Length; //var seasonEvents = db.Events.Where(e => e.SeasonID == selectedSeason.Id); var completedEvents = events.Where(e => e.EventTeamEntries.Any(te => te.Points != null)); if (showAll) minimumEvents = 0; else minimumEvents = completedEvents.Count() - 1; var eventCount = events.Count(); var completedCount = completedEvents.Count(); var seasonCompleted = (eventCount == completedCount); var riders = new Dictionary<int, OrderOfMerit.RiderLine>(); for (int i = 0; i < model.EventCount; i++) { var race = events.ElementAt(i); var eventRiders = race.EventTeamEntries.Where(e=>e.Under17s == under17s).SelectMany(e => e.EventRiderEntries.Select(r => new { Points = e.Points, Rider = r.Rider, Participated = r.Participated })); foreach (var rider in eventRiders) { if (!riders.ContainsKey(rider.Rider.Id))// riderLine == null) { riders[rider.Rider.Id] = new OrderOfMerit.RiderLine(); riders[rider.Rider.Id].Name = rider.Rider.FullName; riders[rider.Rider.Id].Nationality = rider.Rider.Nationality.Name; riders[rider.Rider.Id].EventResults = events.Select(e => new Tuple<int?, bool>(null, true)).ToArray(); } var riderLine = riders[rider.Rider.Id]; riderLine.EventResults[i] = new Tuple<int?, bool>(rider.Points, rider.Participated ?? true); } } foreach (var entry in riders.Values) { var scores = new List<int>(); var competedInAll = true; foreach (var race in entry.EventResults) { if (race.Item1.HasValue) scores.Add(race.Item1.Value); else competedInAll = false; } entry.MeanPoints = GetMean(scores); if (completedCount > 1 && competedInAll) { var subscores = scores.OrderByDescending(s => s).Take(completedCount - 1); entry.ExclusiveMeanPoints = GetMean(subscores); } else entry.ExclusiveMeanPoints = entry.MeanPoints; } /* int a =events.Where(e=>e.EventTeamEntries.Any(ete=>ete.Points != null)).Count(); if (a > 3 && !showAll) minimumEvents = a / 2; else minimumEvents = 0; */ model.Riders = riders.Values.Where(RiderQualifies).OrderBy(r => r.Name); return View(model); }
private bool RiderQualifies(OrderOfMerit.RiderLine arg) { return arg.EventResults.Count(e => e.Item1 != null) >= minimumEvents; }