/// <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); }