public async Task <PagedViewModel <StudentView> > GetStudents(StudentFilters filters, int pageNumber, int pageSize) { Expression <Func <Student, bool> > predicat = s => (string.IsNullOrEmpty(filters.Fio) || (s.LastName + ' ' + s.Name + ' ' + s.MiddleName).Contains(filters.Fio)) && (string.IsNullOrEmpty(filters.NickName) || s.NickName.Contains(filters.NickName)) && (filters.Sex == null || s.Sex == filters.Sex); var count = await repositoryStudent.recordCount(predicat); if (pageSize < 1) { pageSize = 25; } var pageCount = (int)Math.Ceiling((double)count / pageSize); if (pageNumber > pageCount) { pageNumber = pageCount; } if (pageNumber <= 0) { pageNumber = 1; } var skip = (pageNumber - 1) * pageSize; List <StudentView> rows = repositoryStudent.Find(predicat) .Skip(skip) .Take(pageSize) // TODO: EF не может преобразовать это выражение в SQL, нужно подумать как сделать по другому .Where(s => string.IsNullOrEmpty(filters.GroupName) || String.Join(", ", s.StudentGroups.Select(g => g.Group.Name).ToList()).Contains(filters.GroupName)) .Select(r => new StudentView { Id = r.Id, Fio = $"{r.LastName} {r.Name} {r.MiddleName}", Groups = String.Join(", ", r.StudentGroups.Select(g => g.Group.Name)), NickName = r.NickName, Sex = r.Sex } ) .ToList(); var pagedStudents = new PagedViewModel <StudentView> { Rows = rows, TotalCount = count, PageSize = pageSize, PageNumber = pageNumber, PageCount = pageCount }; return(pagedStudents); }
public async Task <PagedViewModel <StudentView> > Get([FromQuery] StudentFilters filters, int pageNumber, int pageSize) { return(await studentsServices.GetStudents(filters, pageNumber, pageSize)); }