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; } }
public AlunoConcursoEstatistica GetConcursoStatsAluno(int idExercicio, int idMatricula, bool anulada = false) { int[] tipoExercicio = new int[] { (int)Exercicio.tipoExercicio.CONCURSO, (int)Exercicio.tipoExercicio.MONTAPROVA }; try { using (var ctx = new AcademicoContext()) { using (var ctxMatDir = new DesenvContext()) { var questoes = (from cq in ctxMatDir.tblConcursoQuestoes join qa in ctxMatDir.tblConcursoQuestoes_Alternativas on cq.intQuestaoID equals qa.intQuestaoID where cq.intProvaID == idExercicio select new { questaoId = qa.intQuestaoID, alternativa = qa.txtLetraAlternativa, alternativaCorreta = (qa.bitCorreta == true || qa.bitCorretaPreliminar == true), anulada = (cq.bitAnulada || (cq.bitAnuladaPosRecurso.HasValue && cq.bitAnuladaPosRecurso.Value == true)) } ).ToList(); var questoesNaoAnuladas = questoes.Where(x => x.anulada == false && x.alternativaCorreta == true).ToList(); var respostasAluno = (from cro in ctx.tblCartaoResposta_objetiva where cro.intClientID == idMatricula && tipoExercicio.Contains(cro.intExercicioTipoId) select new { questaoId = cro.intQuestaoID, alternativa = cro.txtLetraAlternativa, ultimoregistro = cro.dteCadastro } ).Distinct().ToList(); var respostasAlunoNaoAnuladas = (from ra in respostasAluno join q in questoesNaoAnuladas 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 questoesNaoAnuladas join r in respostasAlunoNaoAnuladas on q.questaoId equals r.questaoId where q.alternativa == r.alternativa select q.questaoId ).Distinct().Count(); estatistica.Erros = respostasAlunoNaoAnuladas.Count() - estatistica.Acertos; estatistica.Nota = estatistica.Acertos; return(estatistica); } } } catch { throw; } }