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