public IEnumerable <QuestionDto> GetQuestionsForTest(CreateTestQuery query, string userId) { // Get all public questions IEnumerable <Question> publicQuestions = _entities.Where(q => q.AccessModifier == (int)AccessModifier.Public); // Filter questions with at least one skill from the query skills List <Question> questions = publicQuestions.Where(q => (Utils.ConvertStringIdsToList(q.TestedSkills)) .Join(query.SkillIds, qSid => qSid, sId => sId, (qSid, sId) => sId) .Count() > 0).ToList(); List <QuestionDto> questionDtos = Mapper.Map <IEnumerable <Question>, IEnumerable <QuestionDto> >(questions).ToList(); // Create the Mathcing Vector of the query int matchingVectorLength = (int)MatchingVectorIndex.StartOfSkills + new SkillsRepository(_context).Count(); double[] queryMatchingVector = new double[matchingVectorLength]; queryMatchingVector = BuildMatchingVector ( queryMatchingVector, query.DifficultyLevel, query.SkillIds ); double[] questionMatchingVector = new double[matchingVectorLength]; for (int i = 0; i < questionDtos.Count; i++) { // Create the Mathcing Vector of the question Array.Clear(questionMatchingVector, 0, questionMatchingVector.Length); questionMatchingVector = BuildMatchingVector ( questionMatchingVector, questions[i].Rank, Utils.ConvertStringIdsToList(questions[i].TestedSkills) ); // Calculate vectors distance double sum = 0; for (int j = 0; j < queryMatchingVector.Length; j++) { sum += Math.Pow(questionMatchingVector[j] - queryMatchingVector[j], 2); } questionDtos[i].MatchingDistance = Math.Sqrt(sum); } // Return results ordered by distance return(questionDtos.OrderBy(q => q.MatchingDistance)); }
public IEnumerable <QuestionDto> SearchQuestionsForTest([FromBody] CreateTestQuery query) { IEnumerable <QuestionDto> results = null; try { QuestionsRepository repository = new QuestionsRepository(_appDbContext); var questionDtos = repository.GetQuestionsForTest(query, _clientData.Id); results = repository.IncludeSkills(questionDtos); } catch (Exception e) { _log.LogError(e, "Error searching questions for test"); } return(results); }