├── logo.png
├── msic
└── images
│ └── icon.png
├── src
├── DotNetCore.Collections.Multi
│ ├── DotNetCore.Collections.Multi.csproj
│ ├── MultiDictionary.cs
│ └── MultiList.cs
├── DotNetCore.Collections.Paginable.Chloe
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ ├── Internal
│ │ │ ├── ChloeHelper.cs
│ │ │ ├── Extensions.Int32.cs
│ │ │ ├── ChloeQueryState.cs
│ │ │ └── PaginableChloeCollFactory.cs
│ │ │ ├── PaginableChloeQuery.cs
│ │ │ ├── ChloePage.cs
│ │ │ └── Extensions
│ │ │ └── SolidPageExtensions.cs
│ └── DotNetCore.Collections.Paginable.Chloe.csproj
├── DotNetCore.Collections.Paginable.DosOrm
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ ├── Internal
│ │ │ ├── DosHelper.cs
│ │ │ ├── Extensions.Int32.cs
│ │ │ ├── DosQueryState.cs
│ │ │ └── PaginableDosCollFactory.cs
│ │ │ ├── PaginableDosQuery.cs
│ │ │ ├── DosPage.cs
│ │ │ └── Extensions
│ │ │ └── SolidPageExtensions.cs
│ └── DotNetCore.Collections.Paginable.DosOrm.csproj
├── DotNetCore.Collections.Paginable
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ ├── Internal
│ │ │ ├── Extensions.Int32.cs
│ │ │ ├── LimitedMembersTypes.cs
│ │ │ ├── PaginableConstants.cs
│ │ │ ├── QueryEntryState.cs
│ │ │ ├── PageMemberFactory.cs
│ │ │ └── PaginableCollectionFactory.cs
│ │ │ ├── Abstractions
│ │ │ ├── IQueryEntryState`1.cs
│ │ │ ├── IPaginable.cs
│ │ │ ├── IPaginable`1.cs
│ │ │ ├── IPageMember.cs
│ │ │ ├── IPage`1.cs
│ │ │ └── IPage.cs
│ │ │ ├── EmptyPage.cs
│ │ │ ├── PaginableSettings.cs
│ │ │ ├── PaginableSettingsManager.cs
│ │ │ ├── PaginableQueryable.cs
│ │ │ ├── PaginableEnumerable.cs
│ │ │ ├── PageMember.cs
│ │ │ ├── Extensions
│ │ │ └── PageExtensions.cs
│ │ │ ├── PageMetadata.cs
│ │ │ ├── PageBase.cs
│ │ │ ├── QueryablePage.cs
│ │ │ ├── EnumerablePage.cs
│ │ │ └── PaginableSetBase.cs
│ └── DotNetCore.Collections.Paginable.csproj
├── DotNetCore.Collections.Paginable.SqlKata
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ ├── Internal
│ │ │ ├── Extensions.Int32.cs
│ │ │ ├── SqlKataHelper.cs
│ │ │ ├── SqlKataQueryState.cs
│ │ │ └── PaginableSqlKataCollFactory.cs
│ │ │ ├── PaginableSqlKataQuery.cs
│ │ │ ├── SqlKataPage.cs
│ │ │ └── Extensions
│ │ │ └── SolidPageExtensions.cs
│ └── DotNetCore.Collections.Paginable.SqlKata.csproj
├── DotNetCore.Collections.Paginable.SqlSugar
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ ├── Internal
│ │ │ ├── Extensions.Int32.cs
│ │ │ ├── SqlSugarHelper.cs
│ │ │ ├── SqlSugarQueryState.cs
│ │ │ └── PaginableSqlSugarCollFactory.cs
│ │ │ ├── PaginableSqlSugarQuery.cs
│ │ │ ├── SqlSugarPage.cs
│ │ │ └── Extensions
│ │ │ └── SolidPageExtensions.cs
│ └── DotNetCore.Collections.Paginable.SqlSugar.csproj
├── DotNetCore.Collections.Paginable.NHibernate
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ ├── Internal
│ │ │ ├── Extensions.Int32.cs
│ │ │ ├── NhQueryOverHelper.cs
│ │ │ ├── NhCoreQueryState.cs
│ │ │ └── PaginableNhCoreCollFactory.cs
│ │ │ ├── PaginableNhCoreQuery.cs
│ │ │ └── NhCorePage.cs
│ └── DotNetCore.Collections.Paginable.NHibernate.csproj
├── DotNetCore.Collections.Paginable.FreeSql
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ ├── Internal
│ │ │ ├── FreeSqlHelper.cs
│ │ │ ├── Extensions.Int32.cs
│ │ │ ├── FreeSqlQueryState.cs
│ │ │ └── PaginableFreeSqlCollFactory.cs
│ │ │ ├── PaginableFreeSqlQuery.cs
│ │ │ ├── FreeSqlPage.cs
│ │ │ └── Extensions
│ │ │ └── SolidPageExtensions.cs
│ └── DotNetCore.Collections.Paginable.FreeSql.csproj
├── DotNetCore.Collections.Paginable.EntityFrameworkCore
│ ├── DotNetCore.Collections.Paginable.EntityFrameworkCore.csproj
│ ├── DotNetCore
│ │ └── Collections
│ │ │ └── Paginable
│ │ │ └── SolidPageExtensions.cs
│ └── DotNetCore.Collections.Paginable.EntityFrameworkCore.xml
├── DotNetCore.Collections.Paginable.EntityFramework
│ ├── DotNetCore.Collections.Paginable.EntityFramework.csproj
│ ├── DotNetCore.Collections.Paginable.EntityFramework.xml
│ └── DotNetCore
│ │ └── Collections
│ │ └── Paginable
│ │ └── SolidPageExtensions.cs
└── DotNetCore.Collections.Paginable.FreeSql.DbContext
│ └── DotNetCore.Collections.Paginable.FreeSql.DbContext.csproj
├── tests
├── DotNetCore.Collections.Paginable.Tests
│ ├── Models
│ │ └── Student.cs
│ ├── DotNetCore.Collections.Paginable.Tests.csproj
│ └── GetPageForQueryTest.cs
├── DotNetCore.Collections.Paginable.DbTests
│ ├── Models
│ │ └── Int32Sample.cs
│ ├── DotNetCore.Collections.Paginable.DbTests.csproj
│ ├── Scripts
│ │ └── TestDataScript.sql
│ ├── SqlSugarTests.cs
│ ├── DosORMTests.cs
│ ├── ChloeTests.cs
│ ├── SqlKataTests.cs
│ ├── EfCoreTests.cs
│ └── NhCoreTests.cs
└── DotNetCore.Collections.Paginable.ConsoleTests
│ ├── DotNetCore.Collections.Paginable.ConsoleTests.csproj
│ └── Program.cs
├── performance
└── DotNetCore.Collections.Paginable.Benchmarks
│ ├── Program.cs
│ ├── DotNetCore.Collections.Paginable.Benchmarks.csproj
│ └── PaginableBenchmark.cs
├── sample
├── Sample.Ef
│ ├── Sample.Ef.csproj
│ └── Program.cs
├── Sample
│ └── Sample.csproj
└── Sample.EfCore
│ ├── Sample.EfCore.csproj
│ └── Program.cs
├── LICENSE
├── Publish.bat
├── PublishToMyget.bat
└── .gitignore
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dotnetcore/Collections/HEAD/logo.png
--------------------------------------------------------------------------------
/msic/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dotnetcore/Collections/HEAD/msic/images/icon.png
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Multi/DotNetCore.Collections.Multi.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.Tests/Models/Student.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Tests.Models {
2 | public class Student {
3 | public int Id { get; set; }
4 | public string Name { get; set; }
5 | }
6 | }
--------------------------------------------------------------------------------
/performance/DotNetCore.Collections.Paginable.Benchmarks/Program.cs:
--------------------------------------------------------------------------------
1 | using BenchmarkDotNet.Running;
2 |
3 | namespace DotNetCore.Collections.Paginable.Benchmarks {
4 | class Program {
5 | static void Main(string[] args) {
6 | BenchmarkRunner.Run();
7 | }
8 | }
9 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.Chloe/DotNetCore/Collections/Paginable/Internal/ChloeHelper.cs:
--------------------------------------------------------------------------------
1 | using Chloe;
2 |
3 | namespace DotNetCore.Collections.Paginable.Internal
4 | {
5 | internal static class ChloeHelper
6 | {
7 | public static int Count(IQuery query) => query.Count();
8 | }
9 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.DosOrm/DotNetCore/Collections/Paginable/Internal/DosHelper.cs:
--------------------------------------------------------------------------------
1 | using Dos.ORM;
2 |
3 | namespace DotNetCore.Collections.Paginable.Internal
4 | {
5 | internal static class DosHelper
6 | {
7 | public static int Count(FromSection query) where T : Entity => query.Count();
8 | }
9 | }
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.DbTests/Models/Int32Sample.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace DotNetCore.Collections.Paginable.DbTests.Models
6 | {
7 | public class Int32Sample
8 | {
9 | public virtual int Id { get; set; }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Internal/Extensions.Int32.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Internal
2 | {
3 | internal static class Int32Extensions
4 | {
5 | public static bool IsValid(this int? int32Value)
6 | {
7 | return int32Value is not null;
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.Chloe/DotNetCore/Collections/Paginable/Internal/Extensions.Int32.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Internal
2 | {
3 | internal static class Int32Extensions
4 | {
5 | public static bool IsValid(this int? int32Value)
6 | {
7 | return int32Value is not null;
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.DosOrm/DotNetCore/Collections/Paginable/Internal/Extensions.Int32.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Internal
2 | {
3 | internal static class Int32Extensions
4 | {
5 | public static bool IsValid(this int? int32Value)
6 | {
7 | return int32Value is not null;
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlKata/DotNetCore/Collections/Paginable/Internal/Extensions.Int32.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Internal
2 | {
3 | internal static class Int32Extensions
4 | {
5 | public static bool IsValid(this int? int32Value)
6 | {
7 | return int32Value is not null;
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlSugar/DotNetCore/Collections/Paginable/Internal/Extensions.Int32.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Internal
2 | {
3 | internal static class Int32Extensions
4 | {
5 | public static bool IsValid(this int? int32Value)
6 | {
7 | return int32Value is not null;
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.NHibernate/DotNetCore/Collections/Paginable/Internal/Extensions.Int32.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Internal
2 | {
3 | internal static class Int32Extensions
4 | {
5 | public static bool IsValid(this int? int32Value)
6 | {
7 | return int32Value is not null;
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/sample/Sample.Ef/Sample.Ef.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp3.0
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Multi/MultiDictionary.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace DotNetCore.Collections.Multi
6 | {
7 | // ReSharper disable InconsistentNaming
8 | public class MultiDictionary
9 | {
10 | private readonly List _hashcodeList;
11 |
12 | public MultiDictionary()
13 | {
14 | _hashcodeList = new List();
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlSugar/DotNetCore/Collections/Paginable/Internal/SqlSugarHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using SqlSugar;
3 |
4 | namespace DotNetCore.Collections.Paginable.Internal
5 | {
6 | internal static class SqlSugarHelper
7 | {
8 | public static int Count(ISugarQueryable query) => query.Count();
9 |
10 | public static Task CountAsync(ISugarQueryable query) => query.CountAsync();
11 | }
12 | }
--------------------------------------------------------------------------------
/sample/Sample/Sample.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | netcoreapp2.0
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.NHibernate/DotNetCore/Collections/Paginable/Internal/NhQueryOverHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using NHibernate;
3 |
4 | namespace DotNetCore.Collections.Paginable.Internal
5 | {
6 | internal static class NhQueryOverHelper
7 | {
8 | public static int Count(IQueryOver queryOver) => queryOver.RowCount();
9 | public static Task CountAsync(IQueryOver queryOver) => queryOver.RowCountAsync();
10 | }
11 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.FreeSql/DotNetCore/Collections/Paginable/Internal/FreeSqlHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using FreeSql;
3 |
4 | namespace DotNetCore.Collections.Paginable.Internal
5 | {
6 | internal static class FreeSqlHelper
7 | {
8 | public static long Count(ISelect select) where T : class => select.Count();
9 |
10 | public static Task CountAsync(ISelect select) where T : class => select.CountAsync();
11 | }
12 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlKata/DotNetCore/Collections/Paginable/Internal/SqlKataHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Threading.Tasks;
2 | using SqlKata;
3 | using SqlKata.Execution;
4 |
5 | namespace DotNetCore.Collections.Paginable.Internal
6 | {
7 | internal static class SqlKataHelper
8 | {
9 | public static int Count(Query query) => query.Clone().Count(null);
10 |
11 | public static Task CountAsync(Query query) => query.Clone().CountAsync(null);
12 | }
13 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Internal/LimitedMembersTypes.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable.Internal
2 | {
3 | ///
4 | /// Limited members type
5 | ///
6 | public enum LimitedMembersTypes
7 | {
8 | ///
9 | /// Unlimited
10 | ///
11 | Unlimited = 0,
12 |
13 | ///
14 | /// Customize
15 | ///
16 | Customize = 1,
17 | }
18 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.FreeSql/DotNetCore/Collections/Paginable/Internal/Extensions.Int32.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace DotNetCore.Collections.Paginable.Internal
4 | {
5 | internal static class Int32Extensions
6 | {
7 | public static bool IsValid(this int? int32Value)
8 | {
9 | return int32Value is not null;
10 | }
11 |
12 | public static int AsInt32(this long int64)
13 | {
14 | return Convert.ToInt32(int64);
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/sample/Sample.EfCore/Sample.EfCore.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp2.0
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Abstractions/IQueryEntryState`1.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace DotNetCore.Collections.Paginable.Abstractions
4 | {
5 | ///
6 | /// Query entry state interface
7 | ///
8 | ///
9 | public interface IQueryEntryState
10 | {
11 | ///
12 | /// Gets all values
13 | ///
14 | IEnumerable AllValues { get; }
15 | }
16 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/EmptyPage.cs:
--------------------------------------------------------------------------------
1 | using System.Linq;
2 |
3 | namespace DotNetCore.Collections.Paginable
4 | {
5 | ///
6 | /// Empty page
7 | ///
8 | ///
9 | public class EmptyPage : EnumerablePage
10 | {
11 | ///
12 | /// Create a new instance of
13 | ///
14 | public EmptyPage() : base(Enumerable.Empty(), 1, 0, 0) { }
15 | }
16 | }
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.ConsoleTests/DotNetCore.Collections.Paginable.ConsoleTests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp3.1
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Internal/PaginableConstants.cs:
--------------------------------------------------------------------------------
1 | // ReSharper disable InconsistentNaming
2 |
3 | namespace DotNetCore.Collections.Paginable.Internal
4 | {
5 | internal static class PaginableConstants
6 | {
7 | ///
8 | /// Default page size
9 | ///
10 | public const int DEFAULT_PAGE_SIZE = 50;
11 |
12 | ///
13 | /// Max member items support
14 | ///
15 | public const long MAX_MEMBER_ITEMS_SUPPORT = 1000 * 10000;
16 | }
17 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore.Collections.Paginable.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable
11 | DotNetCore.Collections.Paginable
12 | Paginable extension for collection.
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Abstractions/IPaginable.cs:
--------------------------------------------------------------------------------
1 | using System.Collections;
2 |
3 | // ReSharper disable once CheckNamespace
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// Paginable interface
8 | ///
9 | public interface IPaginable : IEnumerable
10 | {
11 | ///
12 | /// Gets page size
13 | ///
14 | int PageSize { get; }
15 |
16 | ///
17 | /// Gets member count
18 | ///
19 | int MemberCount { get; }
20 | }
21 | }
--------------------------------------------------------------------------------
/performance/DotNetCore.Collections.Paginable.Benchmarks/DotNetCore.Collections.Paginable.Benchmarks.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | netcoreapp3.1
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Abstractions/IPaginable`1.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | // ReSharper disable once CheckNamespace
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// Paginable interface
8 | ///
9 | ///
10 | public interface IPaginable : IEnumerable>, IPaginable
11 | {
12 | ///
13 | /// Get page
14 | ///
15 | /// Page number
16 | ///
17 | IPage GetPage(int pageNumber);
18 | }
19 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/PaginableSettings.cs:
--------------------------------------------------------------------------------
1 | using DotNetCore.Collections.Paginable.Internal;
2 |
3 | namespace DotNetCore.Collections.Paginable
4 | {
5 | ///
6 | /// Paginable settings
7 | ///
8 | public class PaginableSettings
9 | {
10 | ///
11 | /// Gets or sets default page size
12 | ///
13 | public int DefaultPageSize { get; set; } = PaginableConstants.DEFAULT_PAGE_SIZE;
14 |
15 | ///
16 | /// Gets or sets max member items
17 | ///
18 | public long MaxMemberItems { get; set; } = PaginableConstants.MAX_MEMBER_ITEMS_SUPPORT;
19 | }
20 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Abstractions/IPageMember.cs:
--------------------------------------------------------------------------------
1 | // ReSharper disable once CheckNamespace
2 |
3 | namespace DotNetCore.Collections.Paginable
4 | {
5 | ///
6 | /// Page member wrapper interface
7 | ///
8 | ///
9 | public interface IPageMember
10 | {
11 | ///
12 | /// Gets value of current member
13 | ///
14 | T Value { get; }
15 |
16 | ///
17 | /// Gets offset of current member
18 | ///
19 | int Offset { get; }
20 |
21 | ///
22 | /// Gets item number of current member
23 | ///
24 | int ItemNumber { get; }
25 | }
26 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Abstractions/IPage`1.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | // ReSharper disable once CheckNamespace
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// Page interface
8 | ///
9 | ///
10 | public interface IPage : IEnumerable>, IPage
11 | {
12 | ///
13 | /// Gets page member indexer
14 | ///
15 | /// Index
16 | IPageMember this[int index] { get; }
17 |
18 | ///
19 | /// Convert to original items
20 | ///
21 | ///
22 | IEnumerable ToOriginalItems();
23 | }
24 | }
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.Tests/DotNetCore.Collections.Paginable.Tests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | netcoreapp3.1
4 | false
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.DosOrm/DotNetCore.Collections.Paginable.DosOrm.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.DosORM
11 | DotNetCore.Collections.Paginable.DosORM
12 | Paginable extension with Dos.ORM for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.FreeSql/DotNetCore.Collections.Paginable.FreeSql.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.FreeSql
11 | DotNetCore.Collections.Paginable.FreeSql
12 | Paginable extension with NCC FreeSql for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.NHibernate/DotNetCore.Collections.Paginable.NHibernate.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.NHibernate
11 | DotNetCore.Collections.Paginable.NHibernate
12 | Paginable extension with NHibernate for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.Chloe/DotNetCore.Collections.Paginable.Chloe.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.Chloe
11 | DotNetCore.Collections.Paginable.Chloe
12 | Paginable extension with Chloe for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.EntityFrameworkCore/DotNetCore.Collections.Paginable.EntityFrameworkCore.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.EntityFrameworkCore
11 | DotNetCore.Collections.Paginable.EntityFrameworkCore
12 | Paginable extension with Microsoft EntityFrameworkCore for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.EntityFramework/DotNetCore.Collections.Paginable.EntityFramework.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.EntityFramework
11 | DotNetCore.Collections.Paginable.EntityFramework
12 | Paginable extension with Microsoft EntityFramework for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.FreeSql.DbContext/DotNetCore.Collections.Paginable.FreeSql.DbContext.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.FreeSql.DbContext
11 | DotNetCore.Collections.Paginable.FreeSql.DbContext
12 | Paginable extension with NCC FreeSql with DbContext for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/PaginableSettingsManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace DotNetCore.Collections.Paginable
4 | {
5 | ///
6 | /// Paginable settings manager
7 | ///
8 | public static class PaginableSettingsManager
9 | {
10 | // ReSharper disable once InconsistentNaming
11 | private static PaginableSettings _settingsCache { get; set; }
12 |
13 | static PaginableSettingsManager()
14 | => _settingsCache = new PaginableSettings();
15 |
16 | ///
17 | /// Get paginable settings
18 | ///
19 | public static PaginableSettings Settings
20 | => _settingsCache;
21 |
22 | ///
23 | /// Update paginable settings
24 | ///
25 | ///
26 | public static void UpdateSettings(PaginableSettings settings)
27 | => _settingsCache = settings ?? throw new ArgumentNullException(nameof(settings));
28 | }
29 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 AlexLEWIS
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlKata/DotNetCore.Collections.Paginable.SqlKata.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.SqlKata
11 | DotNetCore.Collections.Paginable.SqlKata
12 | Paginable extension with SqlKata for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlSugar/DotNetCore.Collections.Paginable.SqlSugar.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | net5.0;netstandard2.1;net461;net451
7 |
8 |
9 |
10 | DotNetCore.Collections.Paginable.SqlSugar
11 | DotNetCore.Collections.Paginable.SqlSugar
12 | Paginable extension with SqlSugar for collection.
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/Publish.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | if not exist nuget_pub (
3 | md nuget_pub
4 | )
5 |
6 | for /R "nuget_pub" %%s in (*) do (
7 | del "%%s"
8 | )
9 |
10 | set /p key=input key:
11 |
12 | ::Paginable
13 | dotnet pack src/DotNetCore.Collections.Paginable -c Release -o nuget_pub
14 | dotnet pack src/DotNetCore.Collections.Paginable.Chloe -c Release -o nuget_pub
15 | dotnet pack src/DotNetCore.Collections.Paginable.DosOrm -c Release -o nuget_pub
16 | dotnet pack src/DotNetCore.Collections.Paginable.EntityFramework -c Release -o nuget_pub
17 | dotnet pack src/DotNetCore.Collections.Paginable.EntityFrameworkCore -c Release -o nuget_pub
18 | dotnet pack src/DotNetCore.Collections.Paginable.FreeSql -c Release -o nuget_pub
19 | dotnet pack src/DotNetCore.Collections.Paginable.FreeSql.DbContext -c Release -o nuget_pub
20 | dotnet pack src/DotNetCore.Collections.Paginable.NHibernate -c Release -o nuget_pub
21 | dotnet pack src/DotNetCore.Collections.Paginable.SqlKata -c Release -o nuget_pub
22 | dotnet pack src/DotNetCore.Collections.Paginable.SqlSugar -c Release -o nuget_pub
23 |
24 | for /R "nuget_pub" %%s in (*symbols.nupkg) do (
25 | del "%%s"
26 | )
27 |
28 | echo.
29 | echo.
30 |
31 | set source=https://www.nuget.org/api/v2/package
32 |
33 | for /R "nuget_pub" %%s in (*.nupkg) do (
34 | call nuget push "%%s" %key% -Source %source%
35 | echo.
36 | )
37 |
38 | pause
--------------------------------------------------------------------------------
/PublishToMyget.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | if not exist nuget_pub (
3 | md nuget_pub
4 | )
5 |
6 | for /R "nuget_pub" %%s in (*) do (
7 | del "%%s"
8 | )
9 |
10 | set /p key=input key:
11 |
12 | ::Paginable
13 | dotnet pack src/DotNetCore.Collections.Paginable -c Release -o nuget_pub
14 | dotnet pack src/DotNetCore.Collections.Paginable.Chloe -c Release -o nuget_pub
15 | dotnet pack src/DotNetCore.Collections.Paginable.DosOrm -c Release -o nuget_pub
16 | dotnet pack src/DotNetCore.Collections.Paginable.EntityFramework -c Release -o nuget_pub
17 | dotnet pack src/DotNetCore.Collections.Paginable.EntityFrameworkCore -c Release -o nuget_pub
18 | dotnet pack src/DotNetCore.Collections.Paginable.FreeSql -c Release -o nuget_pub
19 | dotnet pack src/DotNetCore.Collections.Paginable.FreeSql.DbContext -c Release -o nuget_pub
20 | dotnet pack src/DotNetCore.Collections.Paginable.NHibernate -c Release -o nuget_pub
21 | dotnet pack src/DotNetCore.Collections.Paginable.SqlKata -c Release -o nuget_pub
22 | dotnet pack src/DotNetCore.Collections.Paginable.SqlSugar -c Release -o nuget_pub
23 |
24 | for /R "nuget_pub" %%s in (*symbols.nupkg) do (
25 | del "%%s"
26 | )
27 |
28 | echo.
29 | echo.
30 |
31 | set source=https://www.myget.org/F/alexinea/api/v2/package
32 |
33 | for /R "nuget_pub" %%s in (*.nupkg) do (
34 | call nuget push "%%s" %key% -Source %source%
35 | echo.
36 | )
37 |
38 | pause
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlKata/DotNetCore/Collections/Paginable/PaginableSqlKataQuery.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using SqlKata;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// SqlKataPage collection
8 | ///
9 | ///
10 | public class PaginableSqlKataQuery : PaginableSetBase
11 | {
12 | private readonly Query _sqlKataQuery;
13 |
14 | // ReSharper disable once UnusedMember.Local
15 | private PaginableSqlKataQuery() { }
16 |
17 | internal PaginableSqlKataQuery(Query query, int pageSize, int realPageCount, int realMemberCount)
18 | : base(pageSize, realPageCount, realMemberCount)
19 | {
20 | _sqlKataQuery = query;
21 | }
22 |
23 | internal PaginableSqlKataQuery(Query query, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount)
24 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
25 | {
26 | _sqlKataQuery = query;
27 | }
28 |
29 | ///
30 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
31 | {
32 | return new(() => new SqlKataPage(_sqlKataQuery, currentPageNumber, pageSize, realMemberCount));
33 | }
34 | }
35 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlSugar/DotNetCore/Collections/Paginable/PaginableSqlSugarQuery.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using SqlSugar;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// SqlSugarPage collection
8 | ///
9 | public class PaginableSqlSugarQuery : PaginableSetBase
10 | {
11 | private readonly ISugarQueryable _sqlSugarQuery;
12 |
13 | // ReSharper disable once UnusedMember.Local
14 | private PaginableSqlSugarQuery() { }
15 |
16 | internal PaginableSqlSugarQuery(ISugarQueryable select, int pageSize, int realPageCount, int realMemberCount)
17 | : base(pageSize, realPageCount, realMemberCount)
18 | {
19 | _sqlSugarQuery = select;
20 | }
21 |
22 | internal PaginableSqlSugarQuery(ISugarQueryable select, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount)
23 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
24 | {
25 | _sqlSugarQuery = select;
26 | }
27 |
28 | ///
29 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
30 | {
31 | return new(() => new SqlSugarPage(_sqlSugarQuery, currentPageNumber, pageSize, realMemberCount));
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.NHibernate/DotNetCore/Collections/Paginable/PaginableNhCoreQuery.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using NHibernate;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// NHibernatePage collection
8 | ///
9 | public class PaginableNhCoreQuery : PaginableSetBase
10 | {
11 | private readonly IQueryOver _nhibernateQueryOver;
12 |
13 | // ReSharper disable once UnusedMember.Local
14 | private PaginableNhCoreQuery() { }
15 |
16 | internal PaginableNhCoreQuery(IQueryOver queryOver, int pageSize, int realPageCount, int realMemberCount)
17 | : base(pageSize, realPageCount, realMemberCount)
18 | {
19 | _nhibernateQueryOver = queryOver;
20 | }
21 |
22 | internal PaginableNhCoreQuery(IQueryOver select, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount)
23 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
24 | {
25 | _nhibernateQueryOver = select;
26 | }
27 |
28 | ///
29 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
30 | {
31 | return new(() => new NhCorePage(_nhibernateQueryOver, currentPageNumber, pageSize, realMemberCount));
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Internal/QueryEntryState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using DotNetCore.Collections.Paginable.Abstractions;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | ///
9 | /// Query entry state
10 | ///
11 | ///
12 | internal class QueryEntryState : IQueryEntryState
13 | {
14 | private readonly Lazy> _mLazyQueryableMembers;
15 |
16 | ///
17 | /// Query entry state
18 | ///
19 | /// Orgin queryable result
20 | /// skip number
21 | /// take number
22 | public QueryEntryState(IQueryable queryable, int skip, int take)
23 | {
24 | if (skip < 0)
25 | throw new ArgumentOutOfRangeException(nameof(skip), $"{nameof(skip)} can not be less than zero");
26 |
27 | if (take < 0)
28 | throw new ArgumentOutOfRangeException(nameof(take), $"{nameof(take)} can not be less than zero");
29 |
30 | _mLazyQueryableMembers = new Lazy>(() => queryable.Skip(skip).Take(take).AsEnumerable());
31 | }
32 |
33 | ///
34 | /// Get all value.
35 | ///
36 | public IEnumerable AllValues => _mLazyQueryableMembers.Value;
37 | }
38 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Abstractions/IPage.cs:
--------------------------------------------------------------------------------
1 | using System.Collections;
2 |
3 | // ReSharper disable once CheckNamespace
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// Page interface
8 | ///
9 | public interface IPage : IEnumerable
10 | {
11 | ///
12 | /// Gets total page count
13 | ///
14 | int TotalPageCount { get; }
15 |
16 | ///
17 | /// Gets total member count
18 | ///
19 | int TotalMemberCount { get; }
20 |
21 | ///
22 | /// Gets current page number
23 | ///
24 | int CurrentPageNumber { get; }
25 |
26 | ///
27 | /// Gets page size
28 | ///
29 | int PageSize { get; }
30 |
31 | ///
32 | /// Gets current page size, may equal to or less than page size.
33 | ///
34 | int CurrentPageSize { get; }
35 |
36 | ///
37 | /// Has previous. If this page is the first page, then returns false.
38 | ///
39 | bool HasPrevious { get; }
40 |
41 | ///
42 | /// Has next. If this page is the last page, then returns false.
43 | ///
44 | bool HasNext { get; }
45 |
46 | ///
47 | /// Get metadata of page
48 | ///
49 | ///
50 | PageMetadata GetMetadata();
51 | }
52 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.FreeSql/DotNetCore/Collections/Paginable/PaginableFreeSqlQuery.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using FreeSql;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// FreeSqlPage collection
8 | ///
9 | public class PaginableFreeSqlQuery : PaginableSetBase where T : class
10 | {
11 | private readonly ISelect _freeSqlQuery;
12 | private readonly bool _includeNestedMembers;
13 |
14 | // ReSharper disable once UnusedMember.Local
15 | private PaginableFreeSqlQuery() { }
16 |
17 | internal PaginableFreeSqlQuery(ISelect select, int pageSize, int realPageCount, int realMemberCount, bool includeNestedMembers)
18 | : base(pageSize, realPageCount, realMemberCount)
19 | {
20 | _freeSqlQuery = select;
21 | _includeNestedMembers = includeNestedMembers;
22 | }
23 |
24 | internal PaginableFreeSqlQuery(ISelect select, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount, bool includeNestedMembers)
25 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
26 | {
27 | _freeSqlQuery = select;
28 | _includeNestedMembers = includeNestedMembers;
29 | }
30 |
31 | ///
32 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
33 | {
34 | return new(() => new FreeSqlPage(_freeSqlQuery, currentPageNumber, pageSize, realMemberCount, _includeNestedMembers));
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/PaginableQueryable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// QueryablePage collection
8 | ///
9 | ///
10 | public class PaginableQueryable : PaginableSetBase
11 | {
12 | private readonly IQueryable _queryable;
13 |
14 | // ReSharper disable once UnusedMember.Local
15 | private PaginableQueryable() { }
16 |
17 | internal PaginableQueryable(IQueryable queryable, int pageSize, int realPageCount, int realMemberCount)
18 | : base(pageSize, realPageCount, realMemberCount)
19 | {
20 | _queryable = queryable;
21 | }
22 |
23 | internal PaginableQueryable(IQueryable queryable, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount)
24 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
25 | {
26 | _queryable = queryable;
27 | }
28 |
29 | ///
30 | /// Get special page
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
37 | {
38 | return new(() => new EnumerablePage(_queryable, currentPageNumber, pageSize, realMemberCount));
39 | }
40 | }
41 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.NHibernate/DotNetCore/Collections/Paginable/Internal/NhCoreQueryState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using DotNetCore.Collections.Paginable.Abstractions;
4 | using NHibernate;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | ///
9 | /// NHibernate query state
10 | ///
11 | ///
12 | public class NhCoreQueryState : IQueryEntryState
13 | {
14 | private readonly Lazy> _mLazyChloeQueryMembers;
15 |
16 | ///
17 | /// NHibernate query state
18 | ///
19 | ///
20 | ///
21 | ///
22 | public NhCoreQueryState(IQueryOver queryOver, int skip, int pageSize)
23 | {
24 | if (queryOver is null)
25 | throw new ArgumentNullException(nameof(queryOver));
26 |
27 | if (skip < 0)
28 | throw new ArgumentOutOfRangeException(nameof(skip), $"{nameof(skip)} can not be less than zero");
29 |
30 | if (pageSize < 0)
31 | throw new ArgumentOutOfRangeException(nameof(pageSize), $"{nameof(pageSize)} can not be less than zero");
32 |
33 | _mLazyChloeQueryMembers = new Lazy>(() => queryOver.Skip(skip).Take(pageSize).Future());
34 | }
35 |
36 | ///
37 | /// Get all value.
38 | ///
39 | public IEnumerable AllValues => _mLazyChloeQueryMembers.Value.GetEnumerable();
40 | }
41 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.Chloe/DotNetCore/Collections/Paginable/PaginableChloeQuery.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Chloe;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// ChloePage collection
8 | ///
9 | public class PaginableChloeQuery : PaginableSetBase
10 | {
11 | private readonly IQuery _chloeQuery;
12 | private readonly Func, IQuery> _additionalQueryFunc;
13 |
14 | // ReSharper disable once UnusedMember.Local
15 | private PaginableChloeQuery() { }
16 |
17 | internal PaginableChloeQuery(IQuery select, int pageSize, int realPageCount, int realMemberCount, Func, IQuery> additionalQueryFunc = null)
18 | : base(pageSize, realPageCount, realMemberCount)
19 | {
20 | _chloeQuery = select;
21 | _additionalQueryFunc = additionalQueryFunc;
22 | }
23 |
24 | internal PaginableChloeQuery(IQuery select, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount,
25 | Func, IQuery> additionalQueryFunc = null)
26 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
27 | {
28 | _chloeQuery = select;
29 | _additionalQueryFunc = additionalQueryFunc;
30 | }
31 |
32 | ///
33 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
34 | {
35 | return new(() => new ChloePage(_chloeQuery, currentPageNumber, pageSize, realMemberCount, _additionalQueryFunc));
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/PaginableEnumerable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// EnumerablePage collection
8 | ///
9 | ///
10 | public class PaginableEnumerable : PaginableSetBase
11 | {
12 | private readonly IEnumerable _enumerable;
13 |
14 | // ReSharper disable once UnusedMember.Local
15 | private PaginableEnumerable() { }
16 |
17 | internal PaginableEnumerable(IEnumerable enumerable, int pageSize, int realPageCount, int realMemberCount)
18 | : base(pageSize, realPageCount, realMemberCount)
19 | {
20 | _enumerable = enumerable;
21 | }
22 |
23 | internal PaginableEnumerable(IEnumerable enumerable, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount)
24 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
25 | {
26 | _enumerable = enumerable;
27 | }
28 |
29 | ///
30 | /// Get special page
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
37 | {
38 | return new(() => new EnumerablePage(_enumerable, currentPageNumber, pageSize, realMemberCount));
39 | }
40 | }
41 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlSugar/DotNetCore/Collections/Paginable/Internal/SqlSugarQueryState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using DotNetCore.Collections.Paginable.Abstractions;
4 | using SqlSugar;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | ///
9 | /// SqlSugar query state
10 | ///
11 | ///
12 | public class SqlSugarQueryState : IQueryEntryState
13 | {
14 | private readonly Lazy> _mLazySqlSugarQueryMembers;
15 |
16 | ///
17 | /// SqlSugar query state
18 | ///
19 | ///
20 | ///
21 | ///
22 | public SqlSugarQueryState(ISugarQueryable query, int currentPageNumber, int pageSize)
23 | {
24 | if (query is null)
25 | throw new ArgumentNullException(nameof(query));
26 |
27 | if (currentPageNumber < 0)
28 | throw new ArgumentOutOfRangeException(nameof(currentPageNumber), $"{nameof(currentPageNumber)} can not be less than zero");
29 |
30 | if (pageSize < 0)
31 | throw new ArgumentOutOfRangeException(nameof(pageSize), $"{nameof(pageSize)} can not be less than zero");
32 |
33 | _mLazySqlSugarQueryMembers = new Lazy>(() => query.ToPageList(currentPageNumber, pageSize));
34 | }
35 |
36 | ///
37 | /// Get all value.
38 | ///
39 | public IEnumerable AllValues => _mLazySqlSugarQueryMembers.Value;
40 | }
41 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlKata/DotNetCore/Collections/Paginable/Internal/SqlKataQueryState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using DotNetCore.Collections.Paginable.Abstractions;
4 | using SqlKata;
5 | using SqlKata.Execution;
6 |
7 | namespace DotNetCore.Collections.Paginable.Internal
8 | {
9 | ///
10 | /// SqlKata query state
11 | ///
12 | ///
13 | internal class SqlKataQueryState : IQueryEntryState
14 | {
15 | private readonly Lazy> _mLazySqlKataQueryMembers;
16 |
17 | ///
18 | /// SqlKata query state
19 | ///
20 | ///
21 | ///
22 | ///
23 | public SqlKataQueryState(Query query, int currentPageNumber, int pageSize)
24 | {
25 | if (query is null)
26 | throw new ArgumentNullException(nameof(query));
27 |
28 | if (currentPageNumber < 0)
29 | throw new ArgumentOutOfRangeException(nameof(currentPageNumber), $"{nameof(currentPageNumber)} can not be less than zero");
30 |
31 | if (pageSize < 0)
32 | throw new ArgumentOutOfRangeException(nameof(pageSize), $"{nameof(pageSize)} can not be less than zero");
33 |
34 | _mLazySqlKataQueryMembers = new Lazy>(() => query.ForPage(currentPageNumber, pageSize).Get());
35 | }
36 |
37 | ///
38 | /// Get all value.
39 | ///
40 | public IEnumerable AllValues => _mLazySqlKataQueryMembers.Value;
41 | }
42 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.DosOrm/DotNetCore/Collections/Paginable/PaginableDosQuery.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Dos.ORM;
3 |
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// DosPage collection
8 | ///
9 | public class PaginableDosQuery : PaginableSetBase where T : Entity
10 | {
11 | private readonly FromSection _dosOrmQuery;
12 |
13 | private readonly Func, FromSection> _additionalQueryFunc;
14 |
15 | // ReSharper disable once UnusedMember.Local
16 | private PaginableDosQuery() { }
17 |
18 | internal PaginableDosQuery(FromSection select, int pageSize, int realPageCount, int realMemberCount, Func, FromSection> additionalQueryFunc = null)
19 | : base(pageSize, realPageCount, realMemberCount)
20 | {
21 | _dosOrmQuery = select;
22 | _additionalQueryFunc = additionalQueryFunc;
23 | }
24 |
25 | internal PaginableDosQuery(FromSection select, int pageSize, int realPageCount, int realMemberCount, int limitedMembersCount,
26 | Func, FromSection> additionalQueryFunc = null)
27 | : base(pageSize, realPageCount, realMemberCount, limitedMembersCount)
28 | {
29 | _dosOrmQuery = select;
30 | _additionalQueryFunc = additionalQueryFunc;
31 | }
32 |
33 | ///
34 | protected override Lazy> GetSpecifiedPage(int currentPageNumber, int pageSize, int realMemberCount)
35 | {
36 | return new(() => new DosPage(_dosOrmQuery, currentPageNumber, pageSize, realMemberCount, _additionalQueryFunc));
37 | }
38 | }
39 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/PageMember.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using DotNetCore.Collections.Paginable.Abstractions;
4 |
5 | namespace DotNetCore.Collections.Paginable
6 | {
7 | ///
8 | /// Page member
9 | ///
10 | ///
11 | public struct PageMember : IPageMember
12 | {
13 | private readonly T _memberValue;
14 | private readonly int _offset;
15 | private readonly int _startIndex;
16 | private readonly IQueryEntryState _state;
17 |
18 | internal PageMember(T memberValue, int offset, ref int startIndex)
19 | {
20 | if (offset < 0)
21 | throw new ArgumentOutOfRangeException(nameof(offset), "offset can not be less than zero.");
22 | _startIndex = startIndex;
23 | _memberValue = memberValue;
24 | _offset = offset;
25 | _state = null;
26 | }
27 |
28 | internal PageMember(IQueryEntryState state, int offset, ref int startIndex)
29 | {
30 | if (offset < 0)
31 | throw new ArgumentOutOfRangeException(nameof(offset), "offset can not be less than zero.");
32 | _startIndex = startIndex;
33 | _memberValue = default;
34 | _offset = offset;
35 | _state = state;
36 | }
37 |
38 | ///
39 | public T Value => _state is null
40 | ? _memberValue
41 | : _state.AllValues.ElementAt(_offset);
42 |
43 | ///
44 | public int Offset => _offset;
45 |
46 | ///
47 | public int ItemNumber => _startIndex + _offset + 1;
48 | }
49 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.FreeSql/DotNetCore/Collections/Paginable/Internal/FreeSqlQueryState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using DotNetCore.Collections.Paginable.Abstractions;
4 | using FreeSql;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | ///
9 | /// FreeSql query state
10 | ///
11 | ///
12 | public class FreeSqlQueryState : IQueryEntryState where T : class
13 | {
14 | private readonly Lazy> _mLazyFreeSqlQueryMembers;
15 |
16 | ///
17 | /// FreeSql query state
18 | ///
19 | ///
20 | ///
21 | ///
22 | ///
23 | public FreeSqlQueryState(ISelect select, int currentPageNumber, int pageSize, bool includeNestedMembers)
24 | {
25 | if (select is null)
26 | throw new ArgumentNullException(nameof(select));
27 |
28 | if (currentPageNumber < 0)
29 | throw new ArgumentOutOfRangeException(nameof(currentPageNumber), $"{nameof(currentPageNumber)} can not be less than zero");
30 |
31 | if (pageSize < 0)
32 | throw new ArgumentOutOfRangeException(nameof(pageSize), $"{nameof(pageSize)} can not be less than zero");
33 |
34 | _mLazyFreeSqlQueryMembers = new Lazy>(() => select.Page(currentPageNumber, pageSize).ToList(includeNestedMembers));
35 | }
36 |
37 | ///
38 | /// Get all value.
39 | ///
40 | public IEnumerable AllValues => _mLazyFreeSqlQueryMembers.Value;
41 | }
42 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.DosOrm/DotNetCore/Collections/Paginable/Internal/DosQueryState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Dos.ORM;
4 | using DotNetCore.Collections.Paginable.Abstractions;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | ///
9 | /// Dos.ORM query state
10 | ///
11 | ///
12 | public class DosQueryState : IQueryEntryState where T : Entity
13 | {
14 | private readonly Lazy> _mLazyDosQueryMembers;
15 |
16 | ///
17 | /// Dos.ORM query state
18 | ///
19 | ///
20 | ///
21 | ///
22 | ///
23 | public DosQueryState(FromSection query, int currentPageNumber, int pageSize, Func, FromSection> additionalQueryFunc = null)
24 | {
25 | if (query is null)
26 | throw new ArgumentNullException(nameof(query));
27 |
28 | if (currentPageNumber < 0)
29 | throw new ArgumentOutOfRangeException(nameof(currentPageNumber), $"{nameof(currentPageNumber)} can not be less than zero");
30 |
31 | if (pageSize < 0)
32 | throw new ArgumentOutOfRangeException(nameof(pageSize), $"{nameof(pageSize)} can not be less than zero");
33 |
34 | _mLazyDosQueryMembers = new Lazy>(() => (additionalQueryFunc?.Invoke(query) ?? query).Page(pageSize, currentPageNumber).ToList());
35 | }
36 |
37 | ///
38 | /// Get all value.
39 | ///
40 | public IEnumerable AllValues => _mLazyDosQueryMembers.Value;
41 | }
42 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.Chloe/DotNetCore/Collections/Paginable/Internal/ChloeQueryState.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Chloe;
4 | using DotNetCore.Collections.Paginable.Abstractions;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | ///
9 | /// Chloe query state
10 | ///
11 | ///
12 | public class ChloeQueryState : IQueryEntryState
13 | {
14 | private readonly Lazy> _mLazyChloeQueryMembers;
15 |
16 | ///
17 | /// Chloe query state
18 | ///
19 | ///
20 | ///
21 | ///
22 | ///
23 | public ChloeQueryState(IQuery query, int currentPageNumber, int pageSize, Func, IQuery> additionalQueryFunc = null)
24 | {
25 | if (query is null)
26 | throw new ArgumentNullException(nameof(query));
27 |
28 | if (currentPageNumber < 0)
29 | throw new ArgumentOutOfRangeException(nameof(currentPageNumber), $"{nameof(currentPageNumber)} can not be less than zero");
30 |
31 | if (pageSize < 0)
32 | throw new ArgumentOutOfRangeException(nameof(pageSize), $"{nameof(pageSize)} can not be less than zero");
33 |
34 | InternalChloeQuery = query.TakePage(currentPageNumber, pageSize);
35 | _mLazyChloeQueryMembers = new Lazy>(() => (additionalQueryFunc?.Invoke(InternalChloeQuery) ?? InternalChloeQuery).ToList());
36 | }
37 |
38 | private IQuery InternalChloeQuery { get; set; }
39 |
40 | ///
41 | /// Get all value.
42 | ///
43 | public IEnumerable AllValues => _mLazyChloeQueryMembers.Value;
44 | }
45 | }
--------------------------------------------------------------------------------
/performance/DotNetCore.Collections.Paginable.Benchmarks/PaginableBenchmark.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 | using BenchmarkDotNet.Attributes;
4 | using ABPaginableCollections = PaginableCollections;
5 |
6 | namespace DotNetCore.Collections.Paginable.Benchmarks {
7 | [MaxColumn, MinColumn]
8 | public class PaginableBenchmark {
9 | private readonly IEnumerable _list;
10 |
11 | public PaginableBenchmark() {
12 | _list = Enumerable.Range(0, 10000000);
13 | }
14 |
15 | [Benchmark]
16 | public int DotNetCoreCollectionEnumerable() {
17 | var paginable = _list.GetPage(15, 50);
18 | return paginable.TotalPageCount;
19 | }
20 |
21 | [Benchmark]
22 | public int PaginableCollectionEnumerable() {
23 | var paginable = ABPaginableCollections.EnumerableExtensions.ToPaginable(_list, 15, 50);
24 | return paginable.Count;
25 | }
26 |
27 | [Benchmark]
28 | public int DotNetCoreCollectionQueryable() {
29 | var paginable = _list.AsQueryable().GetPage(15, 50);
30 | return paginable.TotalPageCount;
31 | }
32 |
33 | [Benchmark]
34 | public int PaginableCollectionQueryable() {
35 | var paginable = ABPaginableCollections.PaginableExtensions.ToPaginable(_list.AsQueryable(), 15, 50);
36 | return paginable.Count;
37 | }
38 |
39 | //[Benchmark]
40 | public int DotNetCoreCollectionEnumerable_ToPaginable() {
41 | var paginable = _list.ToPaginable(50);
42 | var page = paginable.GetPage(15);
43 | return page.TotalPageCount;
44 | }
45 |
46 | //[Benchmark]
47 | public int DotNetCoreCollectionQueryable_ToPaginable() {
48 | var paginable = _list.AsQueryable().ToPaginable(50);
49 | var page = paginable.GetPage(15);
50 | return page.TotalPageCount;
51 | }
52 | }
53 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Internal/PageMemberFactory.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Linq;
3 | using DotNetCore.Collections.Paginable.Abstractions;
4 |
5 | namespace DotNetCore.Collections.Paginable.Internal
6 | {
7 | ///
8 | /// Page member factory
9 | ///
10 | public static class PageMemberFactory
11 | {
12 | ///
13 | /// Create a new instance of
14 | ///
15 | ///
16 | ///
17 | ///
18 | ///
19 | ///
20 | public static PageMember Create(T memberValue, int offset, ref int startIndex)
21 | => new(memberValue, offset, ref startIndex);
22 |
23 | ///
24 | /// Create a new instance of
25 | ///
26 | ///
27 | ///
28 | ///
29 | ///
30 | ///
31 | ///
32 | public static PageMember Create(IEnumerable memberColl, int index, int offset, ref int startIndex)
33 | => new(memberColl.ElementAt(index), offset, ref startIndex);
34 |
35 | ///
36 | /// Create a new instance of
37 | ///
38 | ///
39 | ///
40 | ///
41 | ///
42 | ///
43 | public static PageMember Create(IQueryEntryState state, int offset, ref int startIndex)
44 | => new(state, offset, ref startIndex);
45 | }
46 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.Chloe/DotNetCore/Collections/Paginable/Internal/PaginableChloeCollFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using Chloe;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | internal static class PaginableChloeCollFactory
9 | {
10 | ///
11 | /// Get real member count
.
12 | /// first parameter(l) means limitedMemberCount
,
13 | /// second parameter(c) means count.
14 | ///
15 | ///
16 | private static Func> GetRealMemberCountFunc()
17 | => l => c => l.IsValid() && l.HasValue ? l.Value > c ? c : l.Value : c;
18 |
19 | ///
20 | /// Get real page count
.
21 | /// first parameter(m) means real member count, which has been gotten from
,
22 | /// second parameter(s) means page size.
23 | ///
24 | ///
25 | private static Func> GetRealPageCountFunc()
26 | => m => s => (int) Math.Ceiling((double) m / (double) s);
27 |
28 | ///
29 | /// Make Chloe.Query`1 source to ChloePage collection.
30 | ///
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | public static PaginableChloeQuery CreatePageSet(IQuery query, int? pageSize = null, int? limitedMemberCount = null)
37 | {
38 | if (query is null)
39 | throw new ArgumentNullException(nameof(query));
40 |
41 | pageSize ??= PaginableSettingsManager.Settings.DefaultPageSize;
42 |
43 | var size = pageSize.Value;
44 | var realMemberCount = GetRealMemberCountFunc()(limitedMemberCount)(ChloeHelper.Count(query));
45 | var realPageCount = GetRealPageCountFunc()(realMemberCount)(size);
46 |
47 | return limitedMemberCount.IsValid() && limitedMemberCount.HasValue
48 | ? new PaginableChloeQuery(query, size, realPageCount, realMemberCount, limitedMemberCount.Value)
49 | : new PaginableChloeQuery(query, size, realPageCount, realMemberCount);
50 | }
51 | }
52 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.NHibernate/DotNetCore/Collections/Paginable/Internal/PaginableNhCoreCollFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using NHibernate;
3 |
4 | // ReSharper disable RedundantCast
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | internal static class PaginableNhCoreCollFactory
9 | {
10 | ///
11 | /// Get real member count
.
12 | /// first parameter(l) means limitedMemberCount
,
13 | /// second parameter(c) means count.
14 | ///
15 | ///
16 | private static Func> GetRealMemberCountFunc()
17 | => l => c => l.IsValid() && l.HasValue ? l.Value > c ? c : l.Value : c;
18 |
19 | ///
20 | /// Get real page count
.
21 | /// first parameter(m) means real member count, which has been gotten from
,
22 | /// second parameter(s) means page size.
23 | ///
24 | ///
25 | private static Func> GetRealPageCountFunc()
26 | => m => s => (int) Math.Ceiling((double) m / (double) s);
27 |
28 | ///
29 | /// Make NHibernate QueryOver`1 source to NHibernatePage collection.
30 | ///
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | public static PaginableNhCoreQuery CreatePageSet(IQueryOver queryOver, int? pageSize = null, int? limitedMemberCount = null)
37 | {
38 | if (queryOver is null)
39 | throw new ArgumentNullException(nameof(queryOver));
40 |
41 | pageSize ??= PaginableSettingsManager.Settings.DefaultPageSize;
42 |
43 | var size = pageSize.Value;
44 | var realMemberCount = GetRealMemberCountFunc()(limitedMemberCount)(NhQueryOverHelper.Count(queryOver));
45 | var realPageCount = GetRealPageCountFunc()(realMemberCount)(size);
46 |
47 | return limitedMemberCount.IsValid() && limitedMemberCount.HasValue
48 | ? new PaginableNhCoreQuery(queryOver, size, realPageCount, realMemberCount, limitedMemberCount.Value)
49 | : new PaginableNhCoreQuery(queryOver, size, realPageCount, realMemberCount);
50 | }
51 | }
52 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlSugar/DotNetCore/Collections/Paginable/Internal/PaginableSqlSugarCollFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics.CodeAnalysis;
3 | using SqlSugar;
4 |
5 | namespace DotNetCore.Collections.Paginable.Internal
6 | {
7 | internal static class PaginableSqlSugarCollFactory
8 | {
9 | ///
10 | /// Get real member count
.
11 | /// first parameter(l) means limitedMemberCount
,
12 | /// second parameter(c) means count.
13 | ///
14 | ///
15 | private static Func> GetRealMemberCountFunc()
16 | => l => c => l.IsValid() && l.HasValue ? l.Value > c ? c : l.Value : c;
17 |
18 | ///
19 | /// Get real page count
.
20 | /// first parameter(m) means real member count, which has been gotten from
,
21 | /// second parameter(s) means page size.
22 | ///
23 | ///
24 | [SuppressMessage("ReSharper", "RedundantCast")]
25 | private static Func> GetRealPageCountFunc()
26 | => m => s => (int) Math.Ceiling((double) m / (double) s);
27 |
28 | ///
29 | /// Make SqlSugarQueryable source to SqlSugarPage collection.
30 | ///
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | public static PaginableSqlSugarQuery CreatePageSet(ISugarQueryable query, int? pageSize = null, int? limitedMemberCount = null)
37 | {
38 | if (query is null)
39 | throw new ArgumentNullException(nameof(query));
40 |
41 | pageSize ??= PaginableSettingsManager.Settings.DefaultPageSize;
42 |
43 | var size = pageSize.Value;
44 | var realMemberCount = GetRealMemberCountFunc()(limitedMemberCount)(SqlSugarHelper.Count(query));
45 | var realPageCount = GetRealPageCountFunc()(realMemberCount)(size);
46 |
47 | return limitedMemberCount.IsValid() && limitedMemberCount.HasValue
48 | ? new PaginableSqlSugarQuery(query, size, realPageCount, realMemberCount, limitedMemberCount.Value)
49 | : new PaginableSqlSugarQuery(query, size, realPageCount, realMemberCount);
50 | }
51 | }
52 | }
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.DbTests/DotNetCore.Collections.Paginable.DbTests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | net5.0
4 | false
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | System
31 |
32 |
33 | System.Data
34 |
35 |
36 | System.Xml
37 |
38 |
39 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlKata/DotNetCore/Collections/Paginable/Internal/PaginableSqlKataCollFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics.CodeAnalysis;
3 | using SqlKata;
4 |
5 | namespace DotNetCore.Collections.Paginable.Internal
6 | {
7 | internal static class PaginableSqlKataCollFactory
8 | {
9 | ///
10 | /// Get real member count
.
11 | /// first parameter(l) means limitedMemberCount
,
12 | /// second parameter(c) means count.
13 | ///
14 | ///
15 | private static Func> GetRealMemberCountFunc()
16 | => l => c => l.IsValid() && l.HasValue ? l.Value > c ? c : l.Value : c;
17 |
18 | ///
19 | /// Get real page count
.
20 | /// first parameter(m) means real member count, which has been gotten from
,
21 | /// second parameter(s) means page size.
22 | ///
23 | ///
24 | [SuppressMessage("ReSharper", "RedundantCast")]
25 | private static Func> GetRealPageCountFunc()
26 | => m => s => (int) Math.Ceiling((double) m / (double) s);
27 |
28 | ///
29 | /// Make SqlKata.Query source to SqlKataPage collection.
30 | ///
31 | /// element type of your enumerable result
32 | /// SqlKata.Query
33 | /// page size
34 | /// limited member count
35 | ///
36 | public static PaginableSqlKataQuery CreatePageSet(Query query, int? pageSize = null, int? limitedMemberCount = null)
37 | {
38 | if (query is null)
39 | throw new ArgumentNullException(nameof(query));
40 |
41 | pageSize ??= PaginableSettingsManager.Settings.DefaultPageSize;
42 |
43 | var size = pageSize.Value;
44 | var realMemberCount = GetRealMemberCountFunc()(limitedMemberCount)(SqlKataHelper.Count(query));
45 | var realPageCount = GetRealPageCountFunc()(realMemberCount)(size);
46 |
47 | return limitedMemberCount.IsValid() && limitedMemberCount.HasValue
48 | ? new PaginableSqlKataQuery(query, size, realPageCount, realMemberCount, limitedMemberCount.Value)
49 | : new PaginableSqlKataQuery(query, size, realPageCount, realMemberCount);
50 | }
51 | }
52 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/Extensions/PageExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | // ReSharper disable once CheckNamespace
4 | namespace DotNetCore.Collections.Paginable
5 | {
6 | ///
7 | /// Extensions for page
8 | ///
9 | public static class PageExtensions
10 | {
11 | ///
12 | /// Is current page thr first page?
13 | ///
14 | /// Page
15 | ///
16 | public static bool IsFirst(this IPage page)
17 | {
18 | if (page is null)
19 | throw new ArgumentNullException(nameof(page), $"{nameof(page)} can not be null.");
20 | return !page.HasPrevious;
21 | }
22 |
23 | ///
24 | /// Is current page the last page?
25 | ///
26 | /// Page
27 | ///
28 | public static bool IsLast(this IPage page)
29 | {
30 | if (page is null)
31 | throw new ArgumentNullException(nameof(page), $"{nameof(page)} can not be null.");
32 | return !page.HasNext;
33 | }
34 |
35 | ///
36 | /// The number of the first item of current page.
37 | ///
38 | /// Page
39 | ///
40 | public static int FromMemberNumber(this IPage page)
41 | {
42 | if (page is null)
43 | throw new ArgumentNullException(nameof(page), $"{nameof(page)} can not be null.");
44 |
45 | if (page.TotalMemberCount == 0)
46 | return 0;
47 |
48 | if (!page.HasPrevious)
49 | return 1;
50 |
51 | return (page.CurrentPageNumber - 1) * page.PageSize + 1;
52 | }
53 |
54 | ///
55 | /// The number of the last item of current page.
56 | ///
57 | /// Page
58 | ///
59 | public static int ToMemberNumber(this IPage page)
60 | {
61 | if (page is null)
62 | throw new ArgumentNullException(nameof(page), $"{nameof(page)} can not be null.");
63 |
64 | if (page.TotalMemberCount == 0)
65 | return 0;
66 |
67 | if (!page.HasNext)
68 | return (page.CurrentPageNumber - 1) * page.PageSize + page.CurrentPageSize;
69 |
70 | return page.CurrentPageNumber * page.PageSize;
71 | }
72 | }
73 | }
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.DbTests/Scripts/TestDataScript.sql:
--------------------------------------------------------------------------------
1 | set IDENTITY_INSERT Int32Samples on
2 | INSERT INTO Int32Samples
3 | (Id)
4 | VALUES
5 | (1),
6 | (2),
7 | (3),
8 | (4),
9 | (5),
10 | (6),
11 | (7),
12 | (8),
13 | (9),
14 | (10),
15 | (11),
16 | (12),
17 | (13),
18 | (14),
19 | (15),
20 | (16),
21 | (17),
22 | (18),
23 | (19),
24 | (20),
25 | (21),
26 | (22),
27 | (23),
28 | (24),
29 | (25),
30 | (26),
31 | (27),
32 | (28),
33 | (29),
34 | (30),
35 | (31),
36 | (32),
37 | (33),
38 | (34),
39 | (35),
40 | (36),
41 | (37),
42 | (38),
43 | (39),
44 | (40),
45 | (41),
46 | (42),
47 | (43),
48 | (44),
49 | (45),
50 | (46),
51 | (47),
52 | (48),
53 | (49),
54 | (50),
55 | (51),
56 | (52),
57 | (53),
58 | (54),
59 | (55),
60 | (56),
61 | (57),
62 | (58),
63 | (59),
64 | (60),
65 | (61),
66 | (62),
67 | (63),
68 | (64),
69 | (65),
70 | (66),
71 | (67),
72 | (68),
73 | (69),
74 | (70),
75 | (71),
76 | (72),
77 | (73),
78 | (74),
79 | (75),
80 | (76),
81 | (77),
82 | (78),
83 | (79),
84 | (80),
85 | (81),
86 | (82),
87 | (83),
88 | (84),
89 | (85),
90 | (86),
91 | (87),
92 | (88),
93 | (89),
94 | (90),
95 | (91),
96 | (92),
97 | (93),
98 | (94),
99 | (95),
100 | (96),
101 | (97),
102 | (98),
103 | (99),
104 | (100),
105 | (101),
106 | (102),
107 | (103),
108 | (104),
109 | (105),
110 | (106),
111 | (107),
112 | (108),
113 | (109),
114 | (110),
115 | (111),
116 | (112),
117 | (113),
118 | (114),
119 | (115),
120 | (116),
121 | (117),
122 | (118),
123 | (119),
124 | (120),
125 | (121),
126 | (122),
127 | (123),
128 | (124),
129 | (125),
130 | (126),
131 | (127),
132 | (128),
133 | (129),
134 | (130),
135 | (131),
136 | (132),
137 | (133),
138 | (134),
139 | (135),
140 | (136),
141 | (137),
142 | (138),
143 | (139),
144 | (140),
145 | (141),
146 | (142),
147 | (143),
148 | (144),
149 | (145),
150 | (146),
151 | (147),
152 | (148),
153 | (149),
154 | (150),
155 | (151),
156 | (152),
157 | (153),
158 | (154),
159 | (155),
160 | (156),
161 | (157),
162 | (158),
163 | (159),
164 | (160),
165 | (161),
166 | (162),
167 | (163),
168 | (164),
169 | (165),
170 | (166),
171 | (167),
172 | (168),
173 | (169),
174 | (170),
175 | (171),
176 | (172),
177 | (173),
178 | (174),
179 | (175),
180 | (176),
181 | (177),
182 | (178),
183 | (179),
184 | (180),
185 | (181),
186 | (182),
187 | (183),
188 | (184),
189 | (185),
190 | (186),
191 | (187),
192 | (188),
193 | (189),
194 | (190),
195 | (191),
196 | (192),
197 | (193),
198 | (194),
199 | (195),
200 | (196),
201 | (197),
202 | (198),
203 | (199),
204 | (200),
205 | (201),
206 | (202),
207 | (203),
208 | (204),
209 | (205),
210 | (206),
211 | (207),
212 | (208),
213 | (209),
214 | (210)
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.DosOrm/DotNetCore/Collections/Paginable/Internal/PaginableDosCollFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics.CodeAnalysis;
3 | using Dos.ORM;
4 |
5 | namespace DotNetCore.Collections.Paginable.Internal
6 | {
7 | internal static class PaginableDosCollFactory
8 | {
9 | ///
10 | /// Get real member count
.
11 | /// first parameter(l) means limitedMemberCount
,
12 | /// second parameter(c) means count.
13 | ///
14 | ///
15 | private static Func> GetRealMemberCountFunc()
16 | => l => c => l.IsValid() && l.HasValue ? l.Value > c ? c : l.Value : c;
17 |
18 | ///
19 | /// Get real page count
.
20 | /// first parameter(m) means real member count, which has been gotten from
,
21 | /// second parameter(s) means page size.
22 | ///
23 | ///
24 | [SuppressMessage("ReSharper", "RedundantCast")]
25 | private static Func> GetRealPageCountFunc()
26 | => m => s => (int) Math.Ceiling((double) m / (double) s);
27 |
28 | ///
29 | /// Make Dos.ORM Query`1 source to DosePage collection.
30 | ///
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | ///
37 | public static PaginableDosQuery CreatePageSet(FromSection query, int? pageSize = null, int? limitedMemberCount = null,
38 | Func, FromSection> additionalQueryFunc = null) where T : Entity
39 | {
40 | if (query is null)
41 | throw new ArgumentNullException(nameof(query));
42 |
43 | pageSize ??= PaginableSettingsManager.Settings.DefaultPageSize;
44 |
45 | var size = pageSize.Value;
46 | var realMemberCount = GetRealMemberCountFunc()(limitedMemberCount)(DosHelper.Count(query));
47 | var realPageCount = GetRealPageCountFunc()(realMemberCount)(size);
48 |
49 | return limitedMemberCount.IsValid() && limitedMemberCount.HasValue
50 | ? new PaginableDosQuery(query, size, realPageCount, realMemberCount, limitedMemberCount.Value, additionalQueryFunc)
51 | : new PaginableDosQuery(query, size, realPageCount, realMemberCount, additionalQueryFunc);
52 | }
53 | }
54 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/PageMetadata.cs:
--------------------------------------------------------------------------------
1 | namespace DotNetCore.Collections.Paginable
2 | {
3 | ///
4 | /// Page metadata
5 | ///
6 | public class PageMetadata
7 | {
8 | ///
9 | /// Create a new instance of .
10 | ///
11 | ///
12 | public PageMetadata(IPage page)
13 | {
14 | TotalPageCount = page.TotalPageCount;
15 | RealPageCount = page.TotalMemberCount == 0 ? 0 : page.TotalPageCount;
16 | TotalMemberCount = page.TotalMemberCount;
17 | PageSize = page.PageSize;
18 |
19 | CurrentPageNumber = page.CurrentPageNumber;
20 | CurrentPageSize = page.CurrentPageSize;
21 |
22 | HasPrevious = page.HasPrevious;
23 | HasNext = page.HasNext;
24 | }
25 |
26 | ///
27 | /// Gets total page count
28 | ///
29 | public int TotalPageCount { get; }
30 |
31 | ///
32 | /// Gets real page count
33 | ///
34 | public int RealPageCount { get; }
35 |
36 | ///
37 | /// Gets total member count
38 | ///
39 | public int TotalMemberCount { get; }
40 |
41 | ///
42 | /// Gets current page number
43 | ///
44 | public int CurrentPageNumber { get; }
45 |
46 | ///
47 | /// Gets page size
48 | ///
49 | public int PageSize { get; }
50 |
51 | ///
52 | /// Gets current page size
53 | ///
54 | public int CurrentPageSize { get; }
55 |
56 | ///
57 | /// Has previous. If this page is the first page, then returns false.
58 | ///
59 | public bool HasPrevious { get; }
60 |
61 | ///
62 | /// Has next. If this page is the last page, then returns false.
63 | ///
64 | public bool HasNext { get; }
65 |
66 | ///
67 | public override string ToString()
68 | {
69 | return $@"
70 | =====SUMMARY=====
71 | TotalPageCount = {TotalPageCount}
72 | RealPageCount = {RealPageCount}
73 | TotalMemberCount = {TotalMemberCount}
74 | PageSize = {PageSize}
75 |
76 | =====CURRENT=====
77 | CurrentPageNumber = {CurrentPageNumber}
78 | CurrentPageSize = {CurrentPageSize}
79 |
80 | =====NAVIGATOR=====
81 | HasPrevious = {(HasPrevious ? "Yes" : "No")}
82 | HasNext = {(HasNext ? "Yes" : "No")}
83 | ";
84 | }
85 | }
86 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.FreeSql/DotNetCore/Collections/Paginable/Internal/PaginableFreeSqlCollFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics.CodeAnalysis;
3 | using System.Runtime.CompilerServices;
4 | using FreeSql;
5 |
6 | namespace DotNetCore.Collections.Paginable.Internal
7 | {
8 | internal static class PaginableFreeSqlCollFactory
9 | {
10 | ///
11 | /// Get real member count
.
12 | /// first parameter(l) means limitedMemberCount
,
13 | /// second parameter(c) means count.
14 | ///
15 | ///
16 | private static Func> GetRealMemberCountFunc()
17 | => l => c => l.IsValid() && l.HasValue ? l.Value > c ? c : l.Value : c;
18 |
19 | ///
20 | /// Get real page count
.
21 | /// first parameter(m) means real member count, which has been gotten from
,
22 | /// second parameter(s) means page size.
23 | ///
24 | ///
25 | [SuppressMessage("ReSharper", "RedundantCast")]
26 | private static Func> GetRealPageCountFunc()
27 | => m => s => (int) Math.Ceiling((double) m / (double) s);
28 |
29 | ///
30 | /// Make FreeSql.Select`1 source to FreeSqlPage collection.
31 | ///
32 | ///
33 | ///
34 | ///
35 | ///
36 | ///
37 | ///
38 | public static PaginableFreeSqlQuery CreatePageSet(ISelect select, int? pageSize = null, int? limitedMemberCount = null, bool? includeNestedMembers = null)
39 | where T : class
40 | {
41 | if (select is null)
42 | throw new ArgumentNullException(nameof(select));
43 |
44 | pageSize ??= PaginableSettingsManager.Settings.DefaultPageSize;
45 | includeNestedMembers ??= false;
46 |
47 | var size = pageSize.Value;
48 | var realMemberCount = GetRealMemberCountFunc()(limitedMemberCount)(FreeSqlHelper.Count(select).AsInt32());
49 | var realPageCount = GetRealPageCountFunc()(realMemberCount)(size);
50 |
51 | return limitedMemberCount.IsValid() && limitedMemberCount.HasValue
52 | ? new PaginableFreeSqlQuery(select, size, realPageCount, realMemberCount, limitedMemberCount.Value, includeNestedMembers.Value)
53 | : new PaginableFreeSqlQuery(select, size, realPageCount, realMemberCount, includeNestedMembers.Value);
54 | }
55 | }
56 | }
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.DbTests/SqlSugarTests.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using DotNetCore.Collections.Paginable.DbTests.Models;
5 | using Shouldly;
6 | using SqlSugar;
7 | using Xunit;
8 |
9 | namespace DotNetCore.Collections.Paginable.DbTests
10 | {
11 | public class SqlSugarTests
12 | {
13 | private readonly string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\Development\Collections\tests\DotNetCore.Collections.Paginable.DbTests\DataSource\Samples.mdf;Integrated Security=True";
14 |
15 | private readonly SqlSugarClient _sqlSugar;
16 |
17 | public SqlSugarTests()
18 | {
19 | _sqlSugar = new SqlSugarClient(new ConnectionConfig
20 | {
21 | ConnectionString = connectionString,
22 | DbType = DbType.SqlServer,
23 | IsAutoCloseConnection = true
24 | });
25 |
26 | _sqlSugar.MappingTables.Add("Int32Sample", "Int32Samples");
27 | }
28 |
29 | [Fact]
30 | public void GetPageTest()
31 | {
32 | var page = _sqlSugar.Queryable().GetPage(1, 9);
33 | page.TotalPageCount.ShouldBe(24);
34 | page.TotalMemberCount.ShouldBe(210);
35 | page.CurrentPageNumber.ShouldBe(1);
36 | page.PageSize.ShouldBe(9);
37 | page.CurrentPageSize.ShouldBe(9);
38 | page.HasNext.ShouldBeTrue();
39 | page.HasPrevious.ShouldBeFalse();
40 |
41 | page[0].Value.Id.ShouldBe(1);
42 | page[1].Value.Id.ShouldBe(2);
43 | page[2].Value.Id.ShouldBe(3);
44 | page[3].Value.Id.ShouldBe(4);
45 | page[4].Value.Id.ShouldBe(5);
46 | page[5].Value.Id.ShouldBe(6);
47 | page[6].Value.Id.ShouldBe(7);
48 | page[7].Value.Id.ShouldBe(8);
49 | page[8].Value.Id.ShouldBe(9);
50 | }
51 |
52 | [Fact]
53 | public void ToPaginableTest()
54 | {
55 | var list = _sqlSugar.Queryable().ToPaginable(9);
56 | var page = list.GetPage(2);
57 | page.TotalPageCount.ShouldBe(24);
58 | page.TotalMemberCount.ShouldBe(210);
59 | page.CurrentPageNumber.ShouldBe(2);
60 | page.PageSize.ShouldBe(9);
61 | page.CurrentPageSize.ShouldBe(9);
62 | page.HasNext.ShouldBeTrue();
63 | page.HasPrevious.ShouldBeTrue();
64 |
65 | page[0].Value.Id.ShouldBe(10);
66 | page[1].Value.Id.ShouldBe(11);
67 | page[2].Value.Id.ShouldBe(12);
68 | page[3].Value.Id.ShouldBe(13);
69 | page[4].Value.Id.ShouldBe(14);
70 | page[5].Value.Id.ShouldBe(15);
71 | page[6].Value.Id.ShouldBe(16);
72 | page[7].Value.Id.ShouldBe(17);
73 | page[8].Value.Id.ShouldBe(18);
74 | }
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlKata/DotNetCore/Collections/Paginable/SqlKataPage.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using DotNetCore.Collections.Paginable.Internal;
4 | using SqlKata;
5 |
6 | // ReSharper disable RedundantBaseQualifier
7 | // ReSharper disable RedundantCast
8 |
9 | namespace DotNetCore.Collections.Paginable
10 | {
11 | ///
12 | /// SqlKata page
13 | ///
14 | ///
15 | public class SqlKataPage : PageBase
16 | {
17 | ///
18 | /// SqlKata page
19 | ///
20 | ///
21 | ///
22 | ///
23 | ///
24 | // ReSharper disable once RedundantBaseConstructorCall
25 | public SqlKataPage(Query query, int currentPageNumber, int pageSize, int totalMemberCount) : base(false)
26 | {
27 | var skip = (currentPageNumber - 1) * pageSize;
28 | var state = new SqlKataQueryState(query.Clone(), currentPageNumber, pageSize);
29 | InitializeMetaInfo()(currentPageNumber)(pageSize)(totalMemberCount)(skip)();
30 | base._initializeAction = InitializeMemberList()(state)(CurrentPageSize)(skip);
31 | }
32 |
33 | ///
34 | /// Get empty page
35 | ///
36 | ///
37 | public static EmptyPage Empty() => new();
38 |
39 | private Func>>> InitializeMetaInfo() => c => s => t => k => () =>
40 | {
41 | // c = current page number
42 | // s = page size
43 | // t = total member count
44 | // k = skip
45 | var totalPageCount = (int) Math.Ceiling((double) t / (double) s);
46 | totalPageCount = totalPageCount < 0 ? 0 : totalPageCount;
47 | base.TotalPageCount = totalPageCount == 0 ? 1 : totalPageCount;
48 | base.TotalMemberCount = t;
49 | base.CurrentPageNumber = c;
50 | base.PageSize = s;
51 | base.CurrentPageSize = c == totalPageCount
52 | ? k == 0
53 | ? t
54 | : t % k
55 | : totalPageCount == 0
56 | ? 0
57 | : s;
58 |
59 | base.HasPrevious = c > 1;
60 | base.HasNext = c < base.TotalPageCount;
61 | };
62 |
63 | private Func, Func>> InitializeMemberList() => state => s => k => () =>
64 | {
65 | // s = page size
66 | // k = skip
67 | base._memberList = new List>(s);
68 | for (var i = 0; i < s; i++)
69 | {
70 | base._memberList.Add(PageMemberFactory.Create(state, i, ref k));
71 | }
72 | };
73 | }
74 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.NHibernate/DotNetCore/Collections/Paginable/NhCorePage.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using DotNetCore.Collections.Paginable.Internal;
4 | using NHibernate;
5 |
6 | // ReSharper disable RedundantCast
7 | // ReSharper disable RedundantBaseQualifier
8 |
9 | namespace DotNetCore.Collections.Paginable
10 | {
11 | ///
12 | /// NHibernate page
13 | ///
14 | ///
15 | public class NhCorePage : PageBase
16 | {
17 | ///
18 | /// NHibernate page
19 | ///
20 | ///
21 | ///
22 | ///
23 | ///
24 | // ReSharper disable once RedundantBaseConstructorCall
25 | public NhCorePage(IQueryOver queryOver, int currentPageNumber, int pageSize, int totalMemberCount) : base(false)
26 | {
27 | var skip = (currentPageNumber - 1) * pageSize;
28 | var state = new NhCoreQueryState(queryOver, skip, pageSize);
29 | InitializeMetaInfo()(currentPageNumber)(pageSize)(totalMemberCount)(skip)();
30 | base._initializeAction = InitializeMemberList()(state)(CurrentPageSize)(skip);
31 | }
32 |
33 | ///
34 | /// Get empty page
35 | ///
36 | ///
37 | public static EmptyPage Empty() => new();
38 |
39 | private Func>>> InitializeMetaInfo() => c => s => t => k => () =>
40 | {
41 | // c = current page number
42 | // s = page size
43 | // t = total member count
44 | // k = skip
45 | var totalPageCount = (int) Math.Ceiling((double) t / (double) s);
46 | totalPageCount = totalPageCount < 0 ? 0 : totalPageCount;
47 | base.TotalPageCount = totalPageCount == 0 ? 1 : totalPageCount;
48 | base.TotalMemberCount = t;
49 | base.CurrentPageNumber = c;
50 | base.PageSize = s;
51 | base.CurrentPageSize = c == totalPageCount
52 | ? k == 0
53 | ? t
54 | : t % k
55 | : totalPageCount == 0
56 | ? 0
57 | : s;
58 |
59 | base.HasPrevious = c > 1;
60 | base.HasNext = c < base.TotalPageCount;
61 | };
62 |
63 | private Func, Func>> InitializeMemberList() => state => s => k => () =>
64 | {
65 | // s = page size
66 | // k = skip
67 | base._memberList = new List>(s);
68 | for (var i = 0; i < s; i++)
69 | {
70 | base._memberList.Add(PageMemberFactory.Create(state, i, ref k));
71 | }
72 | };
73 | }
74 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.SqlSugar/DotNetCore/Collections/Paginable/SqlSugarPage.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using DotNetCore.Collections.Paginable.Internal;
4 | using SqlSugar;
5 |
6 | // ReSharper disable RedundantBaseQualifier
7 | // ReSharper disable RedundantCast
8 |
9 | namespace DotNetCore.Collections.Paginable
10 | {
11 | ///
12 | /// SqlSugar page
13 | ///
14 | ///
15 | public class SqlSugarPage : PageBase
16 | {
17 | ///
18 | /// SqlSugar page
19 | ///
20 | ///
21 | ///
22 | ///
23 | ///
24 | // ReSharper disable once RedundantBaseConstructorCall
25 | public SqlSugarPage(ISugarQueryable query, int currentPageNumber, int pageSize, int totalMemberCount) : base(false)
26 | {
27 | var skip = (currentPageNumber - 1) * pageSize;
28 | var state = new SqlSugarQueryState(query, currentPageNumber, pageSize);
29 | InitializeMetaInfo()(currentPageNumber)(pageSize)(totalMemberCount)(skip)();
30 | base._initializeAction = InitializeMemberList()(state)(CurrentPageSize)(skip);
31 | }
32 |
33 | ///
34 | /// Get empty page
35 | ///
36 | ///
37 | public static EmptyPage Empty() => new();
38 |
39 | private Func>>> InitializeMetaInfo() => c => s => t => k => () =>
40 | {
41 | // c = current page number
42 | // s = page size
43 | // t = total member count
44 | // k = skip
45 | var totalPageCount = (int) Math.Ceiling((double) t / (double) s);
46 | totalPageCount = totalPageCount < 0 ? 0 : totalPageCount;
47 | base.TotalPageCount = totalPageCount == 0 ? 1 : totalPageCount;
48 | base.TotalMemberCount = t;
49 | base.CurrentPageNumber = c;
50 | base.PageSize = s;
51 | base.CurrentPageSize = c == totalPageCount
52 | ? k == 0
53 | ? t
54 | : t % k
55 | : totalPageCount == 0
56 | ? 0
57 | : s;
58 |
59 | base.HasPrevious = c > 1;
60 | base.HasNext = c < base.TotalPageCount;
61 | };
62 |
63 | private Func, Func>> InitializeMemberList() => state => s => k => () =>
64 | {
65 | // s = page size
66 | // k = skip
67 | base._memberList = new List>(s);
68 | for (var i = 0; i < s; i++)
69 | {
70 | base._memberList.Add(PageMemberFactory.Create(state, i, ref k));
71 | }
72 | };
73 | }
74 | }
--------------------------------------------------------------------------------
/tests/DotNetCore.Collections.Paginable.DbTests/DosORMTests.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using Dos.ORM;
5 | using DotNetCore.Collections.Paginable.DbTests.Models;
6 | using Shouldly;
7 | using Xunit;
8 |
9 | namespace DotNetCore.Collections.Paginable.DbTests
10 | {
11 | public class DosORMTests
12 | {
13 | private readonly string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\Development\Collections\tests\DotNetCore.Collections.Paginable.DbTests\DataSource\Samples.mdf;Integrated Security=True";
14 |
15 | private readonly DbSession _dosOrmSession;
16 |
17 | public DosORMTests()
18 | {
19 | _dosOrmSession = new DbSession(DatabaseType.SqlServer, connectionString);
20 | }
21 |
22 | [Fact]
23 | public void GetPageTest()
24 | {
25 | var page = _dosOrmSession.From().GetPage(1, 9);
26 | page.TotalPageCount.ShouldBe(24);
27 | page.TotalMemberCount.ShouldBe(210);
28 | page.CurrentPageNumber.ShouldBe(1);
29 | page.PageSize.ShouldBe(9);
30 | page.CurrentPageSize.ShouldBe(9);
31 | page.HasNext.ShouldBeTrue();
32 | page.HasPrevious.ShouldBeFalse();
33 |
34 | page[0].Value.Id.ShouldBe(1);
35 | page[1].Value.Id.ShouldBe(2);
36 | page[2].Value.Id.ShouldBe(3);
37 | page[3].Value.Id.ShouldBe(4);
38 | page[4].Value.Id.ShouldBe(5);
39 | page[5].Value.Id.ShouldBe(6);
40 | page[6].Value.Id.ShouldBe(7);
41 | page[7].Value.Id.ShouldBe(8);
42 | page[8].Value.Id.ShouldBe(9);
43 | }
44 |
45 | [Fact]
46 | public void ToPaginableTest()
47 | {
48 | var list = _dosOrmSession.From().ToPaginable(9);
49 | var page = list.GetPage(2);
50 | page.TotalPageCount.ShouldBe(24);
51 | page.TotalMemberCount.ShouldBe(210);
52 | page.CurrentPageNumber.ShouldBe(2);
53 | page.PageSize.ShouldBe(9);
54 | page.CurrentPageSize.ShouldBe(9);
55 | page.HasNext.ShouldBeTrue();
56 | page.HasPrevious.ShouldBeTrue();
57 |
58 | page[0].Value.Id.ShouldBe(10);
59 | page[1].Value.Id.ShouldBe(11);
60 | page[2].Value.Id.ShouldBe(12);
61 | page[3].Value.Id.ShouldBe(13);
62 | page[4].Value.Id.ShouldBe(14);
63 | page[5].Value.Id.ShouldBe(15);
64 | page[6].Value.Id.ShouldBe(16);
65 | page[7].Value.Id.ShouldBe(17);
66 | page[8].Value.Id.ShouldBe(18);
67 |
68 | }
69 | }
70 |
71 |
72 | public class Int32Sample4DosORM : Entity
73 | {
74 | public Int32Sample4DosORM() : base("Int32Samples") { }
75 |
76 | public virtual int Id { get; set; }
77 |
78 | public override Field[] GetPrimaryKeyFields() => new Field[] { new Field("Id"), };
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable/DotNetCore/Collections/Paginable/PageBase.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 |
6 | namespace DotNetCore.Collections.Paginable
7 | {
8 | ///
9 | /// Abstract page base
10 | ///
11 | ///
12 | public abstract class PageBase : IPage
13 | {
14 | ///
15 | /// Member list
16 | ///
17 | // ReSharper disable once InconsistentNaming
18 | protected IList> _memberList;
19 |
20 | ///
21 | /// Initialize action
22 | ///
23 | // ReSharper disable once InconsistentNaming
24 | protected Action _initializeAction;
25 |
26 | private bool _mHasInitialized;
27 |
28 | ///
29 | /// Page base
30 | ///
31 | ///
32 | protected PageBase(bool sourceIsFull) => SourceIsFull = sourceIsFull;
33 |
34 | ///
35 | public IEnumerator> GetEnumerator()
36 | {
37 | CheckOrInitializePage();
38 | return _memberList.GetEnumerator();
39 | }
40 |
41 | IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
42 |
43 | ///
44 | /// Offset mode
45 | ///
46 | protected bool SourceIsFull { get; private set; }
47 |
48 | ///
49 | public int TotalPageCount { get; protected set; }
50 |
51 | ///
52 | public int TotalMemberCount { get; protected set; }
53 |
54 | ///
55 | public int CurrentPageNumber { get; protected set; }
56 |
57 | ///
58 | public int PageSize { get; protected set; }
59 |
60 | ///
61 | public int CurrentPageSize { get; protected set; }
62 |
63 | ///
64 | public bool HasPrevious { get; protected set; }
65 |
66 | ///
67 | public bool HasNext { get; protected set; }
68 |
69 | ///
70 | public IPageMember this[int index]
71 | {
72 | get
73 | {
74 | CheckOrInitializePage();
75 | return _memberList[index];
76 | }
77 | }
78 |
79 | ///
80 | public PageMetadata GetMetadata() => new(this);
81 |
82 | ///
83 | public IEnumerable ToOriginalItems()
84 | {
85 | CheckOrInitializePage();
86 | return _memberList.Select(x => x.Value);
87 | }
88 |
89 | private void CheckOrInitializePage()
90 | {
91 | if (!_mHasInitialized)
92 | {
93 | _initializeAction?.Invoke();
94 | _mHasInitialized = true;
95 | }
96 | }
97 | }
98 | }
--------------------------------------------------------------------------------
/src/DotNetCore.Collections.Paginable.Chloe/DotNetCore/Collections/Paginable/ChloePage.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using Chloe;
4 | using DotNetCore.Collections.Paginable.Internal;
5 |
6 | // ReSharper disable RedundantBaseQualifier
7 | // ReSharper disable RedundantCast
8 |
9 | namespace DotNetCore.Collections.Paginable
10 | {
11 | ///
12 | /// Chloe page
13 | ///
14 | ///
15 | public class ChloePage : PageBase
16 | {
17 | ///
18 | /// Chloe page
19 | ///
20 | ///
21 | ///
22 | ///
23 | ///
24 | ///
25 | // ReSharper disable once RedundantBaseConstructorCall
26 | public ChloePage(IQuery query, int currentPageNumber, int pageSize, int totalMemberCount, Func, IQuery> additionalQueryFunc = null) : base(false)
27 | {
28 | var skip = (currentPageNumber - 1) * pageSize;
29 | var state = new ChloeQueryState(query, currentPageNumber, pageSize, additionalQueryFunc);
30 | InitializeMetaInfo()(currentPageNumber)(pageSize)(totalMemberCount)(skip)();
31 | base._initializeAction = InitializeMemberList()(state)(CurrentPageSize)(skip);
32 | }
33 |
34 | ///
35 | /// Get empty page
36 | ///
37 | ///
38 | public static EmptyPage Empty() => new();
39 |
40 | private Func