示例#1
0
        public AlunoConcursoEstatistica GetConcursoStatsAluno(int idExercicio, int idMatricula, bool anulada = false)
        {
            int[] tipoExercicio = new int[] { (int)Exercicio.tipoExercicio.CONCURSO, (int)Exercicio.tipoExercicio.MONTAPROVA };

            try
            {
                var questoes = _concursoRepository.GetQuestoesbyIdExercicio(idExercicio);


                var questoesFiltradas = questoes
                                        .Where(x => x.Anulada == false && x.AlternativaCorreta == true)
                                        .GroupBy(x => x.QuestaoId)
                                        .Select(x => new { QuestaoId = x.Key, AlternativasCorretas = x.Select(y => y.Alternativa).ToList() })
                                        .ToList();


                var respostasAluno = _concursoRepository.GetRespostabyIdExercicioIDMatricula(idExercicio, idMatricula, tipoExercicio);



                var respostasAlunoNaoAnuladas = (from ra in respostasAluno
                                                 join q in questoesFiltradas
                                                 on ra.QuestaoId equals q.QuestaoId
                                                 select new { QuestaoId = ra.QuestaoId, Alternativa = ra.Alternativa, ra.Ultimoregistro }
                                                 ).Distinct().ToList();

                var respostasAlunosemduplicada = (from c in respostasAlunoNaoAnuladas
                                                  group c by c.QuestaoId into grp
                                                  where grp.Count() > 1
                                                  select grp.Key
                                                  ).ToList();

                if (respostasAlunosemduplicada.Count > 0)
                {
                    var itemComDuplicata = respostasAlunoNaoAnuladas.Where(a => respostasAlunosemduplicada.Contains(a.QuestaoId)).OrderBy(b => b.Ultimoregistro).ToList();
                    if (itemComDuplicata.Count > 0)
                    {
                        foreach (var item in itemComDuplicata)
                        {
                            var indice = respostasAlunoNaoAnuladas.Where(a => a.QuestaoId == item.QuestaoId && a.Ultimoregistro > item.Ultimoregistro).ToList();
                            if (indice.Count > 0)
                            {
                                respostasAlunoNaoAnuladas.Remove(item);
                            }
                        }
                    }
                }

                var estatistica = new AlunoConcursoEstatistica();

                estatistica.TotalQuestoes = questoes.GroupBy(x => x.QuestaoId).Count();
                estatistica.NaoRealizadas = estatistica.TotalQuestoes - respostasAlunoNaoAnuladas.Select(a => a.QuestaoId).Distinct().Count();

                estatistica.Acertos = (from q in questoesFiltradas
                                       join r in respostasAlunoNaoAnuladas
                                       on q.QuestaoId equals r.QuestaoId
                                       where q.AlternativasCorretas.Contains(r.Alternativa)
                                       select q.QuestaoId
                                       ).Distinct().Count();

                estatistica.Erros = respostasAlunoNaoAnuladas.Count() - estatistica.Acertos;

                if (anulada && respostasAlunoNaoAnuladas.Count() > 0)
                {
                    var anuladas = estatistica.TotalQuestoes - questoesFiltradas.Count();
                    estatistica.NaoRealizadas -= anuladas;
                    estatistica.Acertos       += anuladas;
                }

                estatistica.Nota = estatistica.Acertos;

                return(estatistica);
            }
            catch
            {
                throw;
            }
        }