private Train AddAttemptsToExamTrain(ExamTrain train, IEnumerable <TaskAnswerBindingModel> answers) { //get pairs attempt - answer and add answer value to attempt //attempts in exam train defined already train.TaskAttempts .Join( answers, attempt => attempt.ExamTask.Id, ans => ans.id, ((ta, ua) => new { bindingModel = ua, attempt = ta }) ) .ForEach( x => { var attemptFromTrain = x.attempt; attemptFromTrain.UserAnswer = x.bindingModel.answer; attemptFromTrain = addExtraInfoForType(attemptFromTrain, x.bindingModel); } ); return(train); }
public IEnumerable <ExamTaskViewModel> GenerateNewExamTrain(int userId) { var user = _dbContext.Users.FirstOrDefault(x => x.Id == userId); if (user != null) { var unfinishedTrain = user.Trains.OfType <ExamTrain>() .TrainsOfUsersCurrentExamType()?.FirstOrDefault(x => x.FinishTime == null); if (unfinishedTrain != null) { unfinishedTrain.FinishTime = DateTime.Now; } ExamTrain train = new ExamTrain(); train.Exam = user.CurrentExam; train.User = user; train.StartTime = DateTime.Now; Random rnd = new Random(); //get one task from each topic at fixed random examNumber position var lastIndexOfTasksList = _dbContext .TaskTopics .FirstOrDefault(x => x.Exam.Id == user.CurrentExam.Id)? .ExamTasks .Count() ?? 0; if (lastIndexOfTasksList == 0) { return(new List <ExamTaskViewModel>()); } var examNumber = rnd.Next( 0, lastIndexOfTasksList - 1 ); train.TaskAttempts = _dbContext .TaskTopics .Where(x => x.Exam.Id == user.CurrentExam.Id) .ToList() .Select(x => GenerateNewEmptyAttempt(x.ExamTasks.ElementAt(examNumber))) .ToList(); //save to db _dbContext.Trains.Add(train); _dbContext.SaveChanges(); return(train .TaskAttempts .ToList() .Select(x => new ExamTaskViewModel(x.ExamTask))); } else { return(null); } }