public TabelaCampeonatoEquipes GetTabelaCampeonatoEquipes(int temporada, int?corridaOrder)
        {
            var corridas   = CorridasService.GetCorridasTabela(temporada);
            var equipes    = EquipesService.ObterEquipesTabela(temporada);
            var resultados = ResultadosService.GetResultadosEquipeTemporada(temporada);

            PreencherResultadosEquipesCorridas(corridas, equipes, resultados);

            if (corridaOrder == null)
            {
                equipes.Sort((o, i) => o.Posicao.CompareTo(i.Posicao));
            }
            else
            {
                equipes.Sort((o, i) =>
                             i.Resultados.FirstOrDefault(c => c.CorridaId == corridaOrder.Value) == null ? 0 : i.Resultados.FirstOrDefault(c => c.CorridaId == corridaOrder.Value).Pontos
                             .CompareTo(
                                 o.Resultados.FirstOrDefault(c => c.CorridaId == corridaOrder.Value) == null ? 0 : o.Resultados.FirstOrDefault(c => c.CorridaId == corridaOrder.Value).Pontos
                                 ));
            }

            int pontosRestantes = CalcularPontosRestantes(corridas);

            MarcarEquipesPosicaoMaxima(equipes, pontosRestantes);

            return(new TabelaCampeonatoEquipes(corridas, equipes));
        }
        public void CalcularEquipesTemporada(int temporada)
        {
            var resultados = _resultadosService.GetResultadosEquipeTemporada(temporada);

            var equipesIds       = resultados.GroupBy(o => o.EquipeId).Select(o => o.Key).ToList();
            var equipesTemporada = new List <EquipeTemporadaInclusao>();

            foreach (var equipeId in equipesIds)
            {
                var pontos = resultados.Where(o => o.EquipeId == equipeId).Sum(o => o.Pontos);

                equipesTemporada.Add(new EquipeTemporadaInclusao(equipeId, temporada, pontos, 0));
            }

            equipesTemporada.Sort((o, i) =>
                                  i.Pontos != o.Pontos
                        ? i.Pontos.CompareTo(o.Pontos)
                        : CompararEquipes(i.EquipeId, o.EquipeId, resultados));

            equipesTemporada.ForEach(o => o.Posicao = equipesTemporada.IndexOf(o) + 1);

            foreach (var equipeTemporada in equipesTemporada)
            {
                AddOrUpdate(equipeTemporada);
            }
        }