예제 #1
0
        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);
        }
예제 #2
0
 private bool RiderQualifies(OrderOfMerit.RiderLine arg)
 {
     return arg.EventResults.Count(e => e.Item1 != null) >= minimumEvents;
 }