diff --git a/src/QuerySpecification.EntityFrameworkCore/Extensions/IQueryableExtensions.cs b/src/QuerySpecification.EntityFrameworkCore/Extensions/IQueryableExtensions.cs index 6a38de19..81ad70ad 100644 --- a/src/QuerySpecification.EntityFrameworkCore/Extensions/IQueryableExtensions.cs +++ b/src/QuerySpecification.EntityFrameworkCore/Extensions/IQueryableExtensions.cs @@ -52,7 +52,7 @@ public static IQueryable WithSpecification( /// A task that represents the asynchronous operation. The task result contains the paged result. public static Task> ToPagedResultAsync( this IQueryable source, - PagingFilter filter, + IPagingFilter filter, CancellationToken cancellationToken = default) where TSource : class => ToPagedResultAsync(source, filter, PaginationSettings.Default, cancellationToken); @@ -68,7 +68,7 @@ public static Task> ToPagedResultAsync( /// A task that represents the asynchronous operation. The task result contains the paged result. public static async Task> ToPagedResultAsync( this IQueryable source, - PagingFilter filter, + IPagingFilter filter, PaginationSettings paginationSettings, CancellationToken cancellationToken = default) where TSource : class diff --git a/src/QuerySpecification.EntityFrameworkCore/RepositoryWithMapper.cs b/src/QuerySpecification.EntityFrameworkCore/RepositoryWithMapper.cs index 83be4d6e..8f175005 100644 --- a/src/QuerySpecification.EntityFrameworkCore/RepositoryWithMapper.cs +++ b/src/QuerySpecification.EntityFrameworkCore/RepositoryWithMapper.cs @@ -91,7 +91,7 @@ public virtual async Task> ProjectToListAsync(Specificati } /// - public virtual async Task> ProjectToListAsync(Specification specification, PagingFilter filter, CancellationToken cancellationToken = default) + public virtual async Task> ProjectToListAsync(Specification specification, IPagingFilter filter, CancellationToken cancellationToken = default) { var query = GenerateQuery(specification, true).AsNoTracking(); var projectedQuery = Map(query); diff --git a/src/QuerySpecification/IProjectionRepository.cs b/src/QuerySpecification/IProjectionRepository.cs index 2d145639..da64eb63 100644 --- a/src/QuerySpecification/IProjectionRepository.cs +++ b/src/QuerySpecification/IProjectionRepository.cs @@ -47,5 +47,5 @@ public interface IProjectionRepository where T : class /// The paging filter. /// The cancellation token. /// A task that represents the asynchronous operation. The task result contains the paged list of projected results. - Task> ProjectToListAsync(Specification specification, PagingFilter filter, CancellationToken cancellationToken = default); + Task> ProjectToListAsync(Specification specification, IPagingFilter filter, CancellationToken cancellationToken = default); } diff --git a/src/QuerySpecification/Paging/IPagingFilter.cs b/src/QuerySpecification/Paging/IPagingFilter.cs new file mode 100644 index 00000000..f9fc36fa --- /dev/null +++ b/src/QuerySpecification/Paging/IPagingFilter.cs @@ -0,0 +1,17 @@ +namespace Pozitron.QuerySpecification; + +/// +/// Represents a filter for paging. +/// +public interface IPagingFilter +{ + /// + /// Gets the page number. + /// + int? Page { get; } + + /// + /// Gets the page size. + /// + int? PageSize { get; } +} diff --git a/src/QuerySpecification/Paging/Pagination.cs b/src/QuerySpecification/Paging/Pagination.cs index 83e445ff..787bf23a 100644 --- a/src/QuerySpecification/Paging/Pagination.cs +++ b/src/QuerySpecification/Paging/Pagination.cs @@ -97,7 +97,7 @@ public Pagination(int totalItems, int totalPages, int pageSize, int page, int st /// /// The total number of items. /// The paging filter. - public Pagination(int itemsCount, PagingFilter filter) + public Pagination(int itemsCount, IPagingFilter filter) : this(PaginationSettings.Default, itemsCount, filter.PageSize, filter.Page) { } @@ -119,7 +119,7 @@ public Pagination(int itemsCount, int? pageSize, int? page) /// The pagination settings. /// The total number of items. /// The paging filter. - public Pagination(PaginationSettings paginationSettings, int itemsCount, PagingFilter filter) + public Pagination(PaginationSettings paginationSettings, int itemsCount, IPagingFilter filter) : this(paginationSettings, itemsCount, filter.PageSize, filter.Page) { } @@ -160,9 +160,9 @@ private static int GetHandledTotalItems(int itemsCount) [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int GetHandledPageSize(PaginationSettings settings, int? pageSize) { - if (!pageSize.HasValue || pageSize <= 0) return settings.DefaultPageSize; + if (!pageSize.HasValue || pageSize.Value <= 0) return settings.DefaultPageSize; - if (pageSize > settings.DefaultPageSizeLimit) return settings.DefaultPageSizeLimit; + if (pageSize.Value > settings.DefaultPageSizeLimit) return settings.DefaultPageSizeLimit; return pageSize.Value; } @@ -176,7 +176,7 @@ private static int GetHandledTotalPages(int handledTotalItems, int handledPageSi [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int GetHandledPage(PaginationSettings settings, int handledTotalPages, int? page) { - if (!page.HasValue || page <= 0) return settings.DefaultPage; + if (!page.HasValue || page.Value <= 0) return settings.DefaultPage; if (page.Value > handledTotalPages) return handledTotalPages; diff --git a/src/QuerySpecification/Paging/PagingFilter.cs b/src/QuerySpecification/Paging/PagingFilter.cs index 7c2da92b..d22c7f3d 100644 --- a/src/QuerySpecification/Paging/PagingFilter.cs +++ b/src/QuerySpecification/Paging/PagingFilter.cs @@ -3,7 +3,7 @@ /// /// Represents a filter for paging. /// -public record PagingFilter +public record PagingFilter : IPagingFilter { /// /// Gets or sets the page number.