private static List <DTORelatorioQuestionarioEnunciado> ObterEnunciados( out List <DTORelatorioQuestionarioQuestao> questoes, List <ItemQuestionario> listaItemQuestionario, Questionario questionario, Turma turma) { questoes = new List <DTORelatorioQuestionarioQuestao>(); var listaEnunciados = new List <DTORelatorioQuestionarioEnunciado>(); DTORelatorioQuestionarioEnunciado enunciado = null; var idEnunciado = 0; var questionariosParticipacaoIds = new ManterQuestionarioParticipacao() .ObterTodosIQueryable() .Where(x => x.Questionario.ID == questionario.ID && x.Turma != null && x.Turma.ID == turma.ID) .Select(x => x.ID) .ToList(); var professores = new ManterRespostaParticipacaoProfessor().ObterTodosIQueryable() .Join(new ManterTurmaProfessor().ObterTodos(), rpp => rpp.Professor.ID, tp => tp.Professor.ID, (rpp, tp) => new { rpp, tp }) .Where(x => x.tp.Turma.ID == turma.ID && questionariosParticipacaoIds.Contains(x.rpp.QuestionarioParticipacao.ID)) .Select(x => new { x.rpp.Professor.ID, x.rpp.Professor.Nome, ItemQuestionarioParticipacaoID = x.rpp.ItemQuestionarioParticipacao.ID }) .ToList() .GroupBy(x => new { x.ID, x.Nome }) .Select(x => new ProfessorDto { ID = x.Key.ID, Nome = x.Key.Nome, ItensQuestionarioParticipacaoIds = x.Select(y => y.ItemQuestionarioParticipacaoID).Distinct().ToList() }) .ToList(); foreach (var item in listaItemQuestionario) { // OOYL // Buscar o enunciado da sequencia e atribuir todas as questões que estão entre ele e o próximo enunciado como // subquestões deste enunciado. Caso a ordem das questões esteja mal formada, tudo abaixo deixará de funcionar. if (item.TipoItemQuestionario.ID == (int)enumTipoItemQuestionario.AgrupadorDeQuestoes) { if (enunciado != null) { listaEnunciados.Add(enunciado); } enunciado = new DTORelatorioQuestionarioEnunciado(); idEnunciado = item.ID; enunciado.Id = item.ID; enunciado.Nome = item.Questao; } else { if (enunciado == null) { enunciado = new DTORelatorioQuestionarioEnunciado(); } enunciado.QuestoesRelacionadas.Add(new DTORelatorioQuestionarioQuestao { Id = item.ID, IdEnunciado = idEnunciado, Nome = item.Questao }); if (item.InAvaliaProfessor && professores.Any()) { foreach (var professor in professores) { questoes.Add(new DTORelatorioQuestionarioQuestao { Id = item.ID, IdEnunciado = idEnunciado, Nome = item.Questao, // É fundamental que o nome permaneça o mesmo. AvaliaProfessor = true, IdProfessor = professor.ID, NomeProfessor = professor.Nome, ItensQuestionarioParticipacaoIds = professor.ItensQuestionarioParticipacaoIds }); } } else { questoes.Add(new DTORelatorioQuestionarioQuestao { Id = item.ID, IdEnunciado = idEnunciado, Nome = item.Questao }); } } } if (enunciado != null) { listaEnunciados.Add(enunciado); } return(listaEnunciados); }