private IQueryable <Employee> EmployeesSort(IQueryable <Employee> source, Employee.SortState sortOrder)
        {
            switch (sortOrder)
            {
            case Employee.SortState.FullNameAsc:
                return(source.OrderBy(e => e.FullName));

            case Employee.SortState.FullNameDesc:
                return(source.OrderByDescending(e => e.FullName));

            case Employee.SortState.ExperienceAsc:
                return(source.OrderBy(e => e.FullName));

            case Employee.SortState.ExperienceDesc:
                return(source.OrderByDescending(e => e.Experience));

            case Employee.SortState.PostAsc:
                return(source.OrderBy(e => e.Post.Name));

            case Employee.SortState.PostDesc:
                return(source.OrderByDescending(e => e.Post.Name));

            default:
                return(source);
            }
        }
        // GET: Employees
        public async Task <IActionResult> Index(string fullName, int?experience, int page = 1,
                                                Employee.SortState sortOrder = Employee.SortState.FullNameAsc)
        {
            int pageSize = 10;

            IQueryable <Employee> source = _context.Employees.Include(e => e.Post);

            if (!String.IsNullOrEmpty(fullName))
            {
                source = source.Where(e => e.FullName.Contains(fullName));
            }

            if (experience != null)
            {
                source = source.Where(e => e.Experience == experience.Value);
            }

            source = EmployeesSort(source, sortOrder);

            int count = await source.CountAsync();

            var items = await source.Skip((page - 1) *pageSize).Take(pageSize).ToListAsync();

            EmployeesViewModel viewModel = new EmployeesViewModel()
            {
                EmployeesSort   = new EmployeesSort(sortOrder),
                Employees       = items,
                PageViewModel   = new PageViewModel(count, page, pageSize),
                EmployeesFilter = new EmployeesFilter(fullName, experience)
            };

            return(View(viewModel));
        }
        public EmployeesSort(Employee.SortState sortOrder)
        {
            FullNameSort = sortOrder == Employee.SortState.FullNameAsc ? Employee.SortState.FullNameDesc
                                                                       : Employee.SortState.FullNameAsc;

            ExperienceSort = sortOrder == Employee.SortState.ExperienceAsc ? Employee.SortState.ExperienceDesc
                                                                           : Employee.SortState.ExperienceAsc;

            PostSort = sortOrder == Employee.SortState.PostAsc ? Employee.SortState.PostDesc
                                                               : Employee.SortState.PostAsc;

            Current = sortOrder;
        }