< Summary

Information
Class: Pozitron.QuerySpecification.PaginationExtensions
Assembly: Pozitron.QuerySpecification
File(s): /home/runner/work/QuerySpecification/QuerySpecification/src/QuerySpecification/Evaluators/PaginationExtensions.cs
Tag: 52_11740816328
Line coverage
100%
Covered lines: 23
Uncovered lines: 0
Coverable lines: 23
Total lines: 110
Line coverage: 100%
Branch coverage
100%
Covered branches: 16
Total branches: 16
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ApplyPaging(...)100%22100%
ApplyPaging(...)100%22100%
ApplyPaging(...)100%11100%
ApplyPaging(...)100%22100%
ApplyPaging(...)100%22100%
ApplyPaging(...)100%44100%
ApplyPaging(...)100%44100%

File(s)

/home/runner/work/QuerySpecification/QuerySpecification/src/QuerySpecification/Evaluators/PaginationExtensions.cs

#LineLine coverage
 1namespace Pozitron.QuerySpecification;
 2
 3/// <summary>
 4/// Provides extension methods for applying pagination to queryable and enumerable sources.
 5/// </summary>
 6public static class PaginationExtensions
 7{
 8    /// <summary>
 9    /// Applies pagination to the queryable source based on the specification.
 10    /// </summary>
 11    /// <typeparam name="T">The type of the entity.</typeparam>
 12    /// <typeparam name="TResult">The type of the result.</typeparam>
 13    /// <param name="source">The queryable source.</param>
 14    /// <param name="specification">The specification containing pagination settings.</param>
 15    /// <returns>The paginated queryable source.</returns>
 16    public static IQueryable<TResult> ApplyPaging<T, TResult>(this IQueryable<TResult> source, Specification<T, TResult>
 17    {
 1718        var paging = specification.FirstOrDefault<SpecPaging>(ItemType.Paging);
 2819        if (paging is null) return source;
 20
 621        return ApplyPaging(source, paging.Skip, paging.Take);
 22    }
 23
 24    /// <summary>
 25    /// Applies pagination to the enumerable source based on the specification.
 26    /// </summary>
 27    /// <typeparam name="T">The type of the entity.</typeparam>
 28    /// <typeparam name="TResult">The type of the result.</typeparam>
 29    /// <param name="source">The enumerable source.</param>
 30    /// <param name="specification">The specification containing pagination settings.</param>
 31    /// <returns>The paginated enumerable source.</returns>
 32    public static IEnumerable<TResult> ApplyPaging<T, TResult>(this IEnumerable<TResult> source, Specification<T, TResul
 33    {
 634        var paging = specification.FirstOrDefault<SpecPaging>(ItemType.Paging);
 735        if (paging is null) return source;
 36
 537        return ApplyPaging(source, paging.Skip, paging.Take);
 38    }
 39
 40    /// <summary>
 41    /// Applies pagination to the queryable source based on the pagination settings.
 42    /// </summary>
 43    /// <typeparam name="T">The type of the entity.</typeparam>
 44    /// <param name="source">The queryable source.</param>
 45    /// <param name="pagination">The pagination settings.</param>
 46    /// <returns>The paginated queryable source.</returns>
 47    public static IQueryable<T> ApplyPaging<T>(this IQueryable<T> source, Pagination pagination)
 648        => ApplyPaging(source, pagination.Skip, pagination.Take);
 49
 50    /// <summary>
 51    /// Applies pagination to the queryable source based on the specification.
 52    /// </summary>
 53    /// <typeparam name="T">The type of the entity.</typeparam>
 54    /// <param name="source">The queryable source.</param>
 55    /// <param name="specification">The specification containing pagination settings.</param>
 56    /// <returns>The paginated queryable source.</returns>
 57    public static IQueryable<T> ApplyPaging<T>(this IQueryable<T> source, Specification<T> specification)
 58    {
 2459        var paging = specification.FirstOrDefault<SpecPaging>(ItemType.Paging);
 4060        if (paging is null) return source;
 61
 862        return ApplyPaging(source, paging.Skip, paging.Take);
 63    }
 64
 65    /// <summary>
 66    /// Applies pagination to the enumerable source based on the specification.
 67    /// </summary>
 68    /// <typeparam name="T">The type of the entity.</typeparam>
 69    /// <param name="source">The enumerable source.</param>
 70    /// <param name="specification">The specification containing pagination settings.</param>
 71    /// <returns>The paginated enumerable source.</returns>
 72    public static IEnumerable<T> ApplyPaging<T>(this IEnumerable<T> source, Specification<T> specification)
 73    {
 674        var paging = specification.FirstOrDefault<SpecPaging>(ItemType.Paging);
 775        if (paging is null) return source;
 76
 577        return ApplyPaging(source, paging.Skip, paging.Take);
 78    }
 79
 80    private static IQueryable<T> ApplyPaging<T>(this IQueryable<T> source, int skip, int take)
 81    {
 82        // If skip is 0, avoid adding to the IQueryable. It will generate more optimized SQL that way.
 2083        if (skip > 0)
 84        {
 1785            source = source.Skip(skip);
 86        }
 87
 2088        if (take >= 0)
 89        {
 1890            source = source.Take(take);
 91        }
 92
 2093        return source;
 94    }
 95
 96    private static IEnumerable<T> ApplyPaging<T>(this IEnumerable<T> source, int skip, int take)
 97    {
 1098        if (skip > 0)
 99        {
 8100            source = source.Skip(skip);
 101        }
 102
 10103        if (take >= 0)
 104        {
 8105            source = source.Take(take);
 106        }
 107
 10108        return source;
 109    }
 110}