예제 #1
0
        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);
        }
예제 #2
0
 public async Task <PagedViewModel <StudentView> > Get([FromQuery] StudentFilters filters, int pageNumber, int pageSize)
 {
     return(await studentsServices.GetStudents(filters, pageNumber, pageSize));
 }