/// <summary> /// Page a queryable collection /// </summary> /// <param name="query">Queryable collection</param> /// <param name="pageable">Pageable repository</param> /// <typeparam name="TEntity">Entity type</typeparam> /// <returns>Paged queryable collection</returns> public static IQueryable <TEntity> Page <TEntity>( this IQueryable <TEntity> query, IPageableRepository <TEntity> pageable) where TEntity : class { if (query == null) { throw new ArgumentNullException(nameof(query)); } if (pageable == null) { throw new ArgumentNullException(nameof(pageable)); } if (pageable.PageSize > 0) { if (pageable.PageNumber >= 1) { query = query.Skip((pageable.PageNumber - 1) * pageable.PageSize); } query = query.Take(pageable.PageSize); } return(query); }
protected virtual async Task PageTest(int page, int pageSize, int totalRows, int expectedRows, Func <IPageableRepository <Category>, Task <IEnumerable <Category> > > find) { // Create new empty database using (var connection = CreateConnection()) { InitializeDatabase(connection, "RepositoryTest_Page"); // Arrange var categories = new List <Category>(); for (int i = 0; i < totalRows; i++) { var category = new Category { Name = $"{i % 10}", Description = i.ToString() }; categories.Add(category); } IPageableRepository <Category> categoryRepository = CreateCategoryRepository(connection); await categoryRepository.CreateManyAsync(categories); // Act var pageItems = await find(categoryRepository.Page(page, pageSize)); // Assert Assert.NotNull(pageItems); Assert.Equal(expectedRows, pageItems.Count()); Assert.Equal(totalRows, categoryRepository.TotalItems); Assert.Equal(pageSize == 0 ? 1 : (totalRows / pageSize) + 1, categoryRepository.TotalPages); Assert.Equal(page, categoryRepository.PageNumber); Assert.Equal(page < 2 ? 1 : ((page - 1) * pageSize) + 1, categoryRepository.StartIndex); } }