public async Task <ViewResult> List(FilterGridDTO values) { //First, find the current user signed in to only show their records. User user = await userManager.GetUserAsync(User); //Create an instance of the AbsenceGridBuilder to save the route parameters for Sorting/Filtering the grid into a session. var gridBuilder = new AbsenceGridBuilder(HttpContext.Session, values, nameof(AbsenceRequest.StartDate)); //Set all of the Query options based on route parameters. Will apply these options to the ViewModel list of absence requests at the time of initialization. var options = new AbsenceQueryOptions { Include = "AbsenceType, DurationType, AbsenceStatus, User, AbsenceRequestPeriods", Where = ar => ar.UserId == user.Id, OrderByDirection = gridBuilder.CurrentGrid.SortDirection, }; options.FromDateRange(gridBuilder); options.Filter(gridBuilder); options.Sort(gridBuilder); //Create and initialize the View Model var model = new AbsenceListViewModel { //Set current route Grid = gridBuilder.CurrentGrid, //Absence Requests List with query options applied. AbsenceRequests = data.AbsenceRequests.List(options), //DropDown Lists AbsenceTypes = data.AbsenceTypes.List(), DurationTypes = data.DurationTypes.List(), StatusTypes = data.AbsenceStatusTypes.List(), }; model.TotalPages = gridBuilder.GetTotalPages(model.AbsenceRequests.Count()); //Finally Set the paging. model.AbsenceRequests = model.AbsenceRequests.Skip((gridBuilder.CurrentGrid.PageNumber - 1) * gridBuilder.CurrentGrid.PageSize).Take(gridBuilder.CurrentGrid.PageSize); return(View(model)); }