public IActionResult SubmitQuestion(UserAnswerDto userAnswerDto, int id) { var question = _questionRepository.GetQuestionId(userAnswerDto.QuestionId); foreach (var answer in question.Answers) { if (answer.Correct && answer.Id == userAnswerDto.AnswerId) { _teamRepository.IncrementTeam(userAnswerDto.TeamId); } } return(Ok(new MessageDto("Done"))); }
public async Task SaveResult(UserAnswerDto dto) { //save result Result result = new Result { ExamId = dto.ExamId, UserId = dto.UserId, Time = dto.Time, TotalCorrect = dto.TotalCorrect, DateAt = DateTime.Now }; await _context.Results.AddAsync(result); await _context.SaveChangesAsync(); //get old fail var failQuestions = await _context.FailQuestions.Where(s => s.UserId == dto.UserId).ToListAsync(); var failQuestionIds = failQuestions.Select(s => s.QuestionId); //add new fail var newFails = dto.Answers.Where(s => !s.IsRight).Select(s => s.QuestionId); var needToAdd = newFails.Except(failQuestionIds) .Select(s => new FailQuestion { QuestionId = s, UserId = dto.UserId, Times = 1, Passed = false }); await _context.FailQuestions.AddRangeAsync(needToAdd); //update times fail var increaseTimesIds = failQuestionIds.Intersect(newFails); var increaseTimes = failQuestions.Where(s => increaseTimesIds.Contains(s.Id)).Select(s => s); foreach (var old in increaseTimes) { old.Times += 1; } _context.FailQuestions.UpdateRange(increaseTimes); //update passed var newCorrects = dto.Answers.Where(s => s.IsRight).Select(s => s.QuestionId); var passed = failQuestions.Where(s => newCorrects.Contains(s.QuestionId)).Select(s => s); foreach (var old in passed) { old.Passed = true; } _context.FailQuestions.UpdateRange(passed); await _context.SaveChangesAsync(); }
/// <summary> /// Выполняет проверку ответов пользователя /// </summary> /// <param name="sourceQuizBlock">Исходный блок теста.</param> /// <param name="answeredQuizBlock">Блок теста с ответом пользователя.</param> /// <returns>Значение, показывающее, правильно ли ответил пользователь.</returns> public static bool CheckQuizAnswer(QuizBlockDto sourceQuizBlock, UserAnswerDto answeredQuizBlock) { var userAnswerList = answeredQuizBlock.UserAnswer.Split(new[] { Environment.NewLine }, StringSplitOptions.None); var blockAnswerList = sourceQuizBlock.Answers.Where(e => e.IsCorrect).ToList(); //// Если нет пользовательских ответов - ответ некорректный. if (!userAnswerList.Any()) { return(false); } //// Проверим ответы. var allIsCorrect = true; foreach (var blockAnswer in blockAnswerList) { switch (blockAnswer.AnswerType) { case AnswerBlockType.Text: var firstUserAnswer = userAnswerList.First().Trim(); var firstBlockAnswer = blockAnswer.Text.Trim(); allIsCorrect &= firstBlockAnswer.Equals(firstUserAnswer, StringComparison.InvariantCultureIgnoreCase); break; case AnswerBlockType.Checkbox: case AnswerBlockType.Radio: allIsCorrect &= userAnswerList.Contains(blockAnswer.Id.ToString()); break; default: throw new ArgumentOutOfRangeException(nameof(blockAnswer.AnswerType)); } } return(allIsCorrect); }