Ejemplo n.º 1
0
        /// <summary>
        /// Подготовить тесты к выводу
        /// </summary>
        /// <returns></returns>
        private PreparedTestDto[] GetPreparedTestsAll()
        {
            // вопросы у тестов
            var testQuests = _testDao.GetTestQuestions();
            // группы ответов у вопросов
            var questAnswersGroups = _testDao.GetQuestAnswersGroups();
            // вопросы-группы
            var groupQuests = _questionDao.GetGroupQuestions();

            // массив для подготовленных ответов
            PreparedQuestionDto[] preparedQuests = new PreparedQuestionDto[testQuests.Length];
            for (int i = 0; i < testQuests.Length; i++)
            {
                var quest = testQuests[i];

                // создать вопрос
                preparedQuests[i] = new PreparedQuestionDto {
                    Quest = Mapper.Map <QuestionDto>(quest)
                };

                AnswersGroupDto[] answersGroups;
                if (questAnswersGroups.TryGetValue(quest.QuestId, out answersGroups))
                {
                    preparedQuests[i].AnswersGroups = answersGroups;
                }
            }

            // перегруппировка ответов с учетом групповых вопросов
            preparedQuests = preparedQuests
                             // пропустить вопросы без ответов
                             .Where(x => !x.HasNoAnswers)
                             // сгруппировать вопросы по родителю
                             .GroupBy(x => x.Quest.GroupQuestId ?? x.Quest.Questid)
                             // todo: производительность ?! очень сложно!
                             .Select(gr =>
            {
                Question groupQuest;
                if (groupQuests.TryGetValue(gr.Key, out groupQuest))
                {
                    var preparedQuest = new PreparedQuestionDto
                    {
                        Quest          = new QuestionDto(groupQuest.Questid, groupQuest.Title, groupQuest.Literal, groupQuest.LevelOfDifficulty, groupQuest.AnswerType),
                        ChildQuestions = gr.Select(y => y.Quest).ToArray(),
                        AnswersGroups  = gr.SelectMany(y => y.AnswersGroups).ToArray()
                    };

                    var firstChild = preparedQuest.ChildQuestions[0];

                    // заполнить дополнительную информацию у группового теста
                    // групповой вопрос не привязывается к тестам
                    preparedQuest.Quest.TestId   = firstChild.TestId;
                    preparedQuest.Quest.QuestNum = firstChild.QuestNum;
                    preparedQuest.Quest.MaxTime  = preparedQuest.ChildQuestions.Sum(x => x.MaxTime);

                    return(preparedQuest);
                }

                return(gr.ElementAt(0));
            }).ToArray();

            // группировка по тестам
            var preparedQuestsGroups = preparedQuests.GroupBy(x => x.Quest.TestId).ToArray();
            var testQuestsGroups     = testQuests.GroupBy(x => x.Test).ToDictionary(gr => gr.Key.TestId, gr => gr.Key);

            // формирование подготовленных тестов
            PreparedTestDto[] preparedTests = new PreparedTestDto[preparedQuestsGroups.Length];
            for (int i = 0; i < preparedQuestsGroups.Length; i++)
            {
                var preparedQuestsGroup = preparedQuestsGroups[i];

                // создать подготовленый тест
                preparedTests[i] = new PreparedTestDto
                {
                    Questions = preparedQuestsGroup.ToArray()
                };

                Test test;
                if (testQuestsGroups.TryGetValue(preparedQuestsGroup.Key, out test))
                {
                    preparedTests[i].Test = Mapper.Map <TestDto>(test);
                }
                else
                {
                    // пропускать такие тесты
                    preparedTests[i] = new PreparedTestDto {
                        IsEmpty = true
                    };
                }
            }

            return(preparedTests);
        }