From 445a9d42cf24a8042d0237a7d6812309bf8b6956 Mon Sep 17 00:00:00 2001 From: Fati Iseni Date: Fri, 27 Mar 2026 13:32:07 +0100 Subject: [PATCH] Add IPagingFilter interface with Page and PageSize properties. Replaced usages of PagingFilter with new IPagingFilter interface across methods, constructors, and repositories for improved abstraction and flexibility. Updated PagingFilter to implement IPagingFilter. --- .../Extensions/IQueryableExtensions.cs | 4 ++-- .../RepositoryWithMapper.cs | 2 +- src/QuerySpecification/IProjectionRepository.cs | 2 +- src/QuerySpecification/Paging/IPagingFilter.cs | 17 +++++++++++++++++ src/QuerySpecification/Paging/Pagination.cs | 10 +++++----- src/QuerySpecification/Paging/PagingFilter.cs | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 src/QuerySpecification/Paging/IPagingFilter.cs 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.