Esempio n. 1
0
        // Get all data for the question coverage report for the current logged in user.
        public IOrderedEnumerable <ReportQuestionCoverage> QuestionCoverageReport(string userName)
        {
            // Get number of questions for each unit.
            var questionCoverageCounts = _unitRepository.GetAllUnits()
                                         .Join(_questionRepository.GetAllQuestions(), u => u.Id, q => q.UnitId, (u, q) => new { UnitId = u.Id, UnitName = u.Name, QuestionId = q.Id })
                                         .GroupBy(t => new { t.UnitId, t.UnitName })
                                         .Select(group => new { questionCount = group.Count(), unitId = group.Key.UnitId, unitName = group.Key.UnitName });

            // Get number of revised questions for each unit.
            var revisionCoverageCounts = _unitRepository.GetAllUnits()
                                         .Join(_questionRepository.GetAllQuestions(), u => u.Id, q => q.UnitId, (u, q) => new { UnitId = u.Id, UnitName = u.Name, QuestionId = q.Id })
                                         .Join(_questionRatingRepository.GetAllRatings().Where(qr => qr.UserName == userName), q => q.QuestionId, r => r.QuestionId, (q, r) => new { q.UnitId, q.UnitName, r.Id })
                                         .GroupBy(t => new { t.UnitId, t.UnitName })
                                         .Select(group => new { revisionCount = group.Count(), unitId = group.Key.UnitId, unitName = group.Key.UnitName });

            // Get the union of the question and revision counts.
            var questionCoverageQuery = questionCoverageCounts.SelectMany
                                            (q => revisionCoverageCounts.Where(r => q.unitName == r.unitName).DefaultIfEmpty(),
                                            (q, r) => new ReportQuestionCoverage {
                UnitName = q.unitName, TotalQuestionCount = q.questionCount, RatedQuestionCount = (r != null) ? r.revisionCount : 0, Percentage = (r != null) ? Math.Round(((double)r.revisionCount / (double)q.questionCount) * 100, 2) : 0
            })
                                        .ToList().OrderByDescending(r => r.Percentage);

            return(questionCoverageQuery);
        }
Esempio n. 2
0
        // Get multiple choice question for the currently selected units based on question selection algorithm.
        public Question GetMultipleChoiceQuestionBasedOnRating(string userName)
        {
            // Get the currently selected units.
            var units = _commonHelper.GetSelectedUnitsList(userName).Select(u => u.SelectedUnitId);

            // Find new question.
            var question = _questionRepository.GetAllQuestions().Where(q => !_questionRatingRepository.GetAllRatings().Where(r => r.UserName == userName).Select(r => r.QuestionId).Contains(q.Id) && units.Contains(q.UnitId)).FirstOrDefault();

            // If no new questions found look for question on different criteria.
            if (question is null)
            {
                // Find lowest rated question id.
                var nextQuestionId = _questionRatingRepository.GetAllRatings().Where(r => r.UserName == userName && units.Contains(r.Question.UnitId) && r.Time < DateTime.Now.AddHours(-1) && r.Rating < 6).OrderBy(r => r.Time).FirstOrDefault();

                // If no low rated questions due to be shown look for oldest question id.
                if (nextQuestionId is null)
                {
                    // Get oldest rated question id.
                    nextQuestionId = _questionRatingRepository.GetAllRatings().Where(r => r.UserName == userName && units.Contains(r.Question.UnitId)).OrderBy(r => r.Time).FirstOrDefault();
                }

                if (nextQuestionId != null)
                {
                    // Get the question from the selected id.
                    question = _questionRepository.GetQuestionById(nextQuestionId.QuestionId);
                }
            }

            return(question);
        }