// TODO: update Repo // todo: exceptions; return errors // получение пользователя, сделавшего текущий запрос private async Task AddStudentsToTaskAsync(TaskModel task, int[] studentIDs) { var students = new List <Student>(); foreach (var studentID in studentIDs) { var taskStudentItem = new TaskStudentItem(); var student = await _context.Students.FindAsync(studentID); if (student != null) { taskStudentItem.Student = student; taskStudentItem.Task = task; task.TaskStudentItems.Add(taskStudentItem); } } }
// test // сразу формировать DTO public async Task <OperationDetailDTO <List <SubjectDTO> > > GetMainDataAsync() { var detail = new OperationDetailDTO <List <SubjectDTO> >(); var resSubjectDTOList = new List <SubjectDTO>(); try { var currentUserEntity = await GetUserFromClaimsAsync(); var currentTeacher = await _context.Teachers .Include(t => t.User) .Include(t => t.Department) .ThenInclude(d => d.Faculty) .Where(t => t.UserId == currentUserEntity.Id) .FirstOrDefaultAsync(); // все задачи текущего преподавателя IQueryable <TaskModel> teacherTaskQueryList = from t in _context.TaskModels .Include(t => t.Teacher) .Include(t => t.Group) .ThenInclude(g => g.Tasks) .Include(t => t.Group) .ThenInclude(g => g.Students) .Include(t => t.Subject) .Include(t => t.Type) .Include(t => t.Solutions) .Include(t => t.TaskStudentItems) .Where(t => t.TeacherId == currentTeacher.Id) select t; // все предметы, по которым есть задачи IQueryable <Subject> subjectQueryList_ = from s in _context.Subjects .Include(s => s.Tasks) .Where(s => s.Tasks.Count > 0) select s; // формируем список сущностей предметов var resSubjectEntityList = new List <Subject>(); var resGroupEntityList = new List <Group>(); // из всех задач препода получить список предметов по которым у препода есть задачи foreach (var task in teacherTaskQueryList) { SubjectDTO currentSubjectDTO; GroupDTO currentGroupDTO; var newStudentDTO = new StudentDTO(); if ((currentSubjectDTO = resSubjectDTOList.FirstOrDefault(s => s.Id == task.SubjectId)) != null) { if ((currentGroupDTO = currentSubjectDTO.Groups.FirstOrDefault(g => g.Id == task.GroupId)) != null) { if (currentGroupDTO.Students != null) { foreach (var student in currentGroupDTO.Students) { // get every student solution for current task var ts = new TaskStudentItem(); var solution = new Solution(); if ((ts = task.TaskStudentItems.FirstOrDefault(ts => (ts.StudentId == student.Id) && (ts.TaskId == task.Id))) != null) { var taskDTO = TaskDTO.Map(task); var solEnt = task.Solutions.Where(s => s.StudentId == student.Id).FirstOrDefault(); if (solEnt != null) { taskDTO.Solution = SolutionDTO.Map(solEnt); } student.Tasks.Add(taskDTO); } } } } else { currentGroupDTO = GroupDTO.Map(task.Group); // currentSubjectDTO.Groups.Add(currentGroupDTO); if (currentGroupDTO.Students != null) { foreach (var student in currentGroupDTO.Students) { var ts = new TaskStudentItem(); var solution = new Solution(); if ((ts = task.TaskStudentItems.FirstOrDefault(ts => (ts.StudentId == student.Id) && (ts.TaskId == task.Id))) != null) { var taskDTO = TaskDTO.Map(task); var solEnt = task.Solutions.Where(s => s.StudentId == student.Id).FirstOrDefault(); if (solEnt != null) { taskDTO.Solution = SolutionDTO.Map(solEnt); } student.Tasks.Add(taskDTO); } } } } } else { currentGroupDTO = GroupDTO.Map(task.Group); currentSubjectDTO = SubjectDTO.Map(task.Subject); // наполняем студентов группы заданиями и решениями foreach (var student in currentGroupDTO.Students) { var ts = new TaskStudentItem(); if ((ts = task.TaskStudentItems.FirstOrDefault(ts => (ts.StudentId == student.Id) && (ts.TaskId == task.Id))) != null) { var taskDTO = TaskDTO.Map(task); var solEnt = task.Solutions.Where(s => s.StudentId == student.Id).FirstOrDefault(); if (solEnt != null) { taskDTO.Solution = SolutionDTO.Map(solEnt); } student.Tasks.Add(taskDTO); } } currentSubjectDTO.Groups.Add(currentGroupDTO); resSubjectDTOList.Add(currentSubjectDTO); } } detail.Succeeded = true; detail.Data = resSubjectDTOList; return(new OperationDetailDTO <List <SubjectDTO> > { Data = resSubjectDTOList, Succeeded = true }); } catch (Exception e) { detail.Succeeded = false; detail.ErrorMessages.Add(_serverErrorMessage + e.Message); return(detail); } }