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)); }
/// <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); }
/// <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); }
/// <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); } }