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