Пример #1
0
        public async Task <IActionResult> GetAllStudents(
            [FromQuery] string firstName = "",
            string lastName   = "",
            string middleName = "",
            StudentSex?sex    = null,
            string nickname   = "",
            string groupName  = "",
            int skip          = 0,
            int take          = 0)
        {
            var filter = new StudentListFilter
            {
                GroupName  = groupName,
                FirstName  = firstName,
                LastName   = lastName,
                MiddleName = middleName,
                Nickname   = nickname,
                Sex        = sex,
                Skip       = skip,
                Take       = take
            };

            var result = await _studentService.GetStudents(filter);

            return(new JsonResult(result));
        }
Пример #2
0
        /// <summary>
        /// Получение списка студентов с возможностью пагинации и фильтрации
        /// </summary>
        /// <param name="filter">Фильтры поиска</param>
        /// <returns>Список студентов и количество доступных студентов с данными фильтрами</returns>
        public async Task <StudentList> GetStudents(StudentListFilter filter)
        {
            var result       = new StudentList();
            var filteredList = FilterStudents(filter);

            result.Count = filteredList.Count();

            result.Students = await filteredList
                              .Paging(filter.Take, filter.Skip)
                              .Select(s => (StudentListItem)s)
                              .ToListAsync();

            return(result);
        }
Пример #3
0
        /// <summary>
        /// Начальная фильтрация студентов
        /// </summary>
        /// <param name="filter">Фильтры</param>
        /// <returns>Отфильтрованный список студентов</returns>
        private IQueryable <Student> FilterStudents(StudentListFilter filter)
        {
            IQueryable <Student> query = _context.Students
                                         // В EF Core LazyLoading организована через прокси, так что при обращении извне нужен Include
                                         .Include(s => s.Groups)
                                         .ThenInclude(sg => sg.Group);

            foreach (var condition in filter.GetConditionExpressions())
            {
                query = query.Where(condition);
            }

            return(query);
        }
Пример #4
0
        /// <summary>
        /// Получение списка ExpressionTree, которые можно затем кидать в LINQ, на основе фильтров
        /// </summary>
        /// <param name="filter">Фильтры</param>
        /// <returns>Список ExpressionTree</returns>
        public static IEnumerable <Expression <Func <Student, bool> > > GetConditionExpressions(this StudentListFilter filter)
        {
            var allConditions = new List <(bool Condition, Expression <Func <Student, bool> > Expression)>
            {
                (!string.IsNullOrWhiteSpace(filter.FirstName), s => s.FirstName.Contains(filter.FirstName)),
                (!string.IsNullOrWhiteSpace(filter.LastName), s => s.LastName.Contains(filter.LastName)),
                (!string.IsNullOrWhiteSpace(filter.MiddleName), s => s.MiddleName.Contains(filter.MiddleName)),
                (!string.IsNullOrWhiteSpace(filter.Nickname), s => s.Nickname.Contains(filter.Nickname)),
                (filter.Sex != null, s => s.Sex == filter.Sex),
                (!string.IsNullOrWhiteSpace(filter.GroupName), s => s.Groups.Any(g => g.Group.Name.Contains(filter.GroupName))),
            };

            foreach (var condition in allConditions.Where(c => c.Condition))
            {
                yield return(condition.Expression);
            }
        }