public void SaveResponse(object answerId) { Question question = Quiz.CurrentQuestion; if (!Quiz.CurrentQuestion.Answers.Any(a => (int)_AssignmentQuizRepository.IdOfAnswer(a) == (int)answerId)) { return; } Answer answer = Quiz.CurrentQuestion.Answers.Where(a => (int)_AssignmentQuizRepository.IdOfAnswer(a) == (int)answerId).Single(); QuestionResponse response = new QuestionResponse(DateTime.Now, answer); Quiz.CurrentQuestion.Responses.Add(response); if (IsFinished) { Quiz.Assignment.Completed = true; } _AssignmentQuizRepository[AssignmentId] = Quiz; ShowIncorrectMessage = !response.Answer.IsCorrect; if (Quiz.NextQuestion != null) { SaveCurrentTestTakingStep(Quiz.NextQuestion.Order); } }
new public AssignmentQuiz this[object assignmentId] { get { Assignment assignment = base[assignmentId]; string quizQuery = @" SELECT Quiz.[QuizTopic], Quiz.[NumCorrectRequired], QuestionID, Text, PresentationOrder FROM [dbo].[Question] JOIN [dbo].[QuizDefinition] AS Quiz ON Quiz.[QuizDefinitionID] = Question.[QuizDefinitionID] JOIN [dbo].[EmployeeQuizAssignments] AS Assignment ON Assignment.[QuizDefinitionID] = Question.[QuizDefinitionID] WHERE Assignment.[Id] = @Id "; KeyValuePair<IList<object>, IList<Question>> questions = DBHelper.ExecuteReader<KeyValuePair<IList<object>, IList<Question>>>(new SqlConnection(DBHelper.ConnectionString), new SqlCommand(quizQuery), LoadQuestions, new SqlParameter() { ParameterName = "@Id", DbType = DbType.Int64, Value = assignmentId }); string responseQuery = @" SELECT [ResponseID], [AnswerID], [QuestionID], [ResponseDateTime] FROM [dbo].[Response] WHERE [EmployeeQuizAssignmentId] = @Id "; List<QuestionResponse> questionResponses = new List<QuestionResponse>(); questionResponses.AddRange( DBHelper.ExecuteReader<IList<QuestionResponse>>(new SqlConnection(DBHelper.ConnectionString), new SqlCommand(responseQuery), delegate(IDataReader reader) { List<QuestionResponse> responses = new List<QuestionResponse>(); while (reader.Read()) { Answer answer = _AnswersById[reader.GetInt32(reader.GetOrdinal("AnswerID"))]; QuestionResponse response = new QuestionResponse( reader.GetDateTime(reader.GetOrdinal("ResponseDateTime")), answer); responses.Add(response); _IdsByHashCode.Add(response.GetHashCode(), reader.GetInt32(reader.GetOrdinal("QuestionID"))); } return responses; }, new SqlParameter() { ParameterName = "@Id", DbType = DbType.Int64, Value = assignmentId })); foreach (Question question in questions.Value) { object idOfQuestion = _IdsByHashCode[question.GetHashCode()]; //Get responses that match it. List<QuestionResponse> matchingResponses = questionResponses.Where(q => (int)_IdsByHashCode[q.GetHashCode()] == (int)idOfQuestion).ToList(); foreach (QuestionResponse response in matchingResponses) { question.Responses.Add(response); } } AssignmentQuiz quiz = new AssignmentQuiz(questions.Key[0].ToString(), (int)questions.Key[1], assignment, questions.Value); return quiz; } set { base[assignmentId] = value.Assignment; string insertResponse = @" INSERT INTO [dbo].[Response] ([EmployeeQuizAssignmentId], [QuestionID], [AnswerID], [Correct], [ResponseDateTime]) VALUES (@Id, @QuestionId, @AnswerId, @Correct, @ResponseDateTime) "; if (value.Questions != null) { foreach (Question question in value.Questions) { if (question.Responses != null) { foreach (QuestionResponse response in question.Responses) { if (!_IdsByHashCode.ContainsKey(response.GetHashCode())) { object responseId = DBHelper.ExecuteNonQuery<object>( new SqlConnection(DBHelper.ConnectionString), new SqlCommand(insertResponse), delegate(int rowsAffected, IDbConnection connection) { if (rowsAffected == 1) { string identityQuery = @"SELECT SCOPE_IDENTITY()"; return DBHelper.ExecuteReader<object>( connection, new SqlCommand(identityQuery), delegate(IDataReader reader) { reader.Read(); return reader[0]; }); } return null; }, new SqlParameter() { ParameterName = "@Id", DbType = DbType.Int64, Value = _IdsByHashCode[value.Assignment.GetHashCode()] }, new SqlParameter() { ParameterName = "@QuestionId", DbType = DbType.Int32, Value = _IdsByHashCode[question.GetHashCode()] }, new SqlParameter() { ParameterName = "@AnswerId", DbType = DbType.Int32, Value = _IdsByHashCode[response.Answer.GetHashCode()] }, new SqlParameter() { ParameterName = "@Correct", DbType = DbType.Boolean, Value = response.Answer.IsCorrect }, new SqlParameter() { ParameterName = "@ResponseDateTime", DbType = DbType.DateTime, Value = response.Responded }); if (responseId != null) { _IdsByHashCode.Add(response.GetHashCode(), responseId); } } //if } //foreach } //if } //foreach } //if } }