/// <summary>
        /// Converts the specified source to <see cref="IPagedListModel{T}"/> by the specified <paramref name="pageNumber"/> and <paramref name="pageSize"/>.
        /// </summary>
        /// <typeparam name="T">The type of the source.</typeparam>
        /// <param name="source">The source to paging.</param>
        /// <param name="pageNumber">The number of the page, index from 1.</param>
        /// <param name="pageSize">The size of the page.</param>
        /// <param name="cancellationToken">
        ///     A <see cref="CancellationToken" /> to observe while waiting for the task to complete.
        /// </param>
        /// <returns>An instance of  implements  <see cref="IPagedListModel{T}"/> interface.</returns>
        public static async Task <IPagedListModel <T> > ToPagedListAsync <T>(this IQueryable <T> source, int pageNumber, int pageSize, CancellationToken cancellationToken = default)
        {
            if (pageNumber <= 0)
            {
                pageNumber = 1;
            }
            if (pageSize <= 0)
            {
                pageSize = 10;
            }

            var count = await source.CountAsync(cancellationToken).ConfigureAwait(false);

            if (count == 0)
            {
                return(new PagedListModel <T>()
                {
                    PageNumber = pageNumber, PageSize = pageSize, TotalCount = 0
                });
            }

            if (pageNumber > 1)
            {
                source = source.Skip((pageNumber - 1) * pageSize);
            }
            var items = await source
                        .Take(pageSize)
                        .ToArrayAsync(cancellationToken);

            var pagedList = new PagedListModel <T>()
            {
                PageNumber = pageNumber,
                PageSize   = pageSize,
                TotalCount = count,
                Data       = items
            };

            return(pagedList);
        }
        /// <summary>
        /// Converts the specified source to <see cref="IPagedListModel{T}"/> by the specified <paramref name="pageNumber"/> and <paramref name="pageSize"/>.
        /// </summary>
        /// <typeparam name="T">The type of the source.</typeparam>
        /// <param name="source">The source to paging.</param>
        /// <param name="pageNumber">The number of the page, index from 1.</param>
        /// <param name="pageSize">The size of the page.</param>
        /// <returns>An instance of  implements <see cref="IPagedListModel{T}"/> interface.</returns>
        public static IPagedListModel <T> ToPagedList <T>(this IQueryable <T> source, int pageNumber, int pageSize)
        {
            if (pageNumber <= 0)
            {
                pageNumber = 1;
            }
            if (pageSize <= 0)
            {
                pageSize = 10;
            }
            var count = source.Count();

            if (count == 0)
            {
                return(new PagedListModel <T>()
                {
                    PageNumber = pageNumber, PageSize = pageSize, TotalCount = 0
                });
            }

            if (pageNumber > 1)
            {
                source = source.Skip((pageNumber - 1) * pageSize);
            }
            var items = source
                        .Take(pageSize)
                        .ToArray();
            var pagedList = new PagedListModel <T>()
            {
                PageNumber = pageNumber,
                PageSize   = pageSize,
                TotalCount = count,
                Data       = items
            };

            return(pagedList);
        }