Skip to content

Commit 60417a3

Browse files
committed
Integrate Collections.Paginable for FreeSql, Chloe and SqlSugar.
1 parent cab3e64 commit 60417a3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1457
-132
lines changed

DotNetCore.Collections.sln

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{46E7BBBE
3636
EndProject
3737
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.Collections.Paginable.ConsoleTests", "tests\DotNetCore.Collections.Paginable.ConsoleTests\DotNetCore.Collections.Paginable.ConsoleTests.csproj", "{24223D17-E4A2-4484-86DF-BEB387883CCC}"
3838
EndProject
39-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetCore.Collections.Paginable.SqlKata", "src\DotNetCore.Collections.Paginable.SqlKata\DotNetCore.Collections.Paginable.SqlKata.csproj", "{3AE56F11-CBDB-4720-9B42-7BC954EF59B1}"
39+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.Collections.Paginable.SqlKata", "src\DotNetCore.Collections.Paginable.SqlKata\DotNetCore.Collections.Paginable.SqlKata.csproj", "{3AE56F11-CBDB-4720-9B42-7BC954EF59B1}"
4040
EndProject
41-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetCore.Collections.Paginable.DbTests", "tests\DotNetCore.Collections.Paginable.DbTests\DotNetCore.Collections.Paginable.DbTests.csproj", "{2D243CBA-A0C4-452D-82AC-C8CD8E2B8DB1}"
41+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.Collections.Paginable.DbTests", "tests\DotNetCore.Collections.Paginable.DbTests\DotNetCore.Collections.Paginable.DbTests.csproj", "{2D243CBA-A0C4-452D-82AC-C8CD8E2B8DB1}"
42+
EndProject
43+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetCore.Collections.Paginable.FreeSql", "src\DotNetCore.Collections.Paginable.FreeSql\DotNetCore.Collections.Paginable.FreeSql.csproj", "{412CB5DF-79AC-4D74-9C80-07E014D6BD37}"
44+
EndProject
45+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetCore.Collections.Paginable.SqlSugar", "src\DotNetCore.Collections.Paginable.SqlSugar\DotNetCore.Collections.Paginable.SqlSugar.csproj", "{E661C0CF-BF25-456D-A6F7-8868B70FD244}"
46+
EndProject
47+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetCore.Collections.Paginable.Chloe", "src\DotNetCore.Collections.Paginable.Chloe\DotNetCore.Collections.Paginable.Chloe.csproj", "{E38949F0-8196-4B68-8A03-C85FC6DF237A}"
4248
EndProject
4349
Global
4450
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -82,6 +88,18 @@ Global
8288
{2D243CBA-A0C4-452D-82AC-C8CD8E2B8DB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
8389
{2D243CBA-A0C4-452D-82AC-C8CD8E2B8DB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
8490
{2D243CBA-A0C4-452D-82AC-C8CD8E2B8DB1}.Release|Any CPU.Build.0 = Release|Any CPU
91+
{412CB5DF-79AC-4D74-9C80-07E014D6BD37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
92+
{412CB5DF-79AC-4D74-9C80-07E014D6BD37}.Debug|Any CPU.Build.0 = Debug|Any CPU
93+
{412CB5DF-79AC-4D74-9C80-07E014D6BD37}.Release|Any CPU.ActiveCfg = Release|Any CPU
94+
{412CB5DF-79AC-4D74-9C80-07E014D6BD37}.Release|Any CPU.Build.0 = Release|Any CPU
95+
{E661C0CF-BF25-456D-A6F7-8868B70FD244}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
96+
{E661C0CF-BF25-456D-A6F7-8868B70FD244}.Debug|Any CPU.Build.0 = Debug|Any CPU
97+
{E661C0CF-BF25-456D-A6F7-8868B70FD244}.Release|Any CPU.ActiveCfg = Release|Any CPU
98+
{E661C0CF-BF25-456D-A6F7-8868B70FD244}.Release|Any CPU.Build.0 = Release|Any CPU
99+
{E38949F0-8196-4B68-8A03-C85FC6DF237A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
100+
{E38949F0-8196-4B68-8A03-C85FC6DF237A}.Debug|Any CPU.Build.0 = Debug|Any CPU
101+
{E38949F0-8196-4B68-8A03-C85FC6DF237A}.Release|Any CPU.ActiveCfg = Release|Any CPU
102+
{E38949F0-8196-4B68-8A03-C85FC6DF237A}.Release|Any CPU.Build.0 = Release|Any CPU
85103
EndGlobalSection
86104
GlobalSection(SolutionProperties) = preSolution
87105
HideSolutionNode = FALSE
@@ -97,6 +115,9 @@ Global
97115
{24223D17-E4A2-4484-86DF-BEB387883CCC} = {26527A0B-471B-4AF2-AFF3-C20CDB9AB6F1}
98116
{3AE56F11-CBDB-4720-9B42-7BC954EF59B1} = {5835FD91-1071-4A30-865A-FEF116868E0E}
99117
{2D243CBA-A0C4-452D-82AC-C8CD8E2B8DB1} = {26527A0B-471B-4AF2-AFF3-C20CDB9AB6F1}
118+
{412CB5DF-79AC-4D74-9C80-07E014D6BD37} = {5835FD91-1071-4A30-865A-FEF116868E0E}
119+
{E661C0CF-BF25-456D-A6F7-8868B70FD244} = {5835FD91-1071-4A30-865A-FEF116868E0E}
120+
{E38949F0-8196-4B68-8A03-C85FC6DF237A} = {5835FD91-1071-4A30-865A-FEF116868E0E}
100121
EndGlobalSection
101122
GlobalSection(ExtensibilityGlobals) = postSolution
102123
SolutionGuid = {71513A6C-8231-46C2-ADE8-0288FD4654D8}

Publish.bat

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ for /R "nuget_pub" %%s in (*) do (
88
)
99

1010
dotnet pack src/DotNetCore.Collections.Paginable -c Release -o ../../nuget_pub
11+
dotnet pack src/DotNetCore.Collections.Paginable.Chloe -c Release -o ../../nuget_pub
12+
dotnet pack src/DotNetCore.Collections.Paginable.FreeSql -c Release -o ../../nuget_pub
1113
dotnet pack src/DotNetCore.Collections.Paginable.SqlKata -c Release -o ../../nuget_pub
14+
dotnet pack src/DotNetCore.Collections.Paginable.SqlSugar -c Release -o ../../nuget_pub
1215

1316
for /R "nuget_pub" %%s in (*symbols.nupkg) do (
1417
del %%s

build/version.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<Project>
22
<PropertyGroup>
33
<VersionMajor>2</VersionMajor>
4-
<VersionMinor>0</VersionMinor>
5-
<VersionPatch>2</VersionPatch>
4+
<VersionMinor>1</VersionMinor>
5+
<VersionPatch>0</VersionPatch>
66
<VersionQuality></VersionQuality>
77
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
88
</PropertyGroup>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Chloe;
4+
using DotNetCore.Collections.Paginable.Internal;
5+
6+
namespace DotNetCore.Collections.Paginable
7+
{
8+
/// <summary>
9+
/// Chloe page
10+
/// </summary>
11+
/// <typeparam name="T"></typeparam>
12+
public class ChloePage<T> : PageBase<T>
13+
{
14+
/// <summary>
15+
/// Chloe page
16+
/// </summary>
17+
/// <param name="query"></param>
18+
/// <param name="currentPageNumber"></param>
19+
/// <param name="pageSize"></param>
20+
/// <param name="totalMemberCount"></param>
21+
/// <param name="additionalQueryFunc"></param>
22+
public ChloePage(IQuery<T> query, int currentPageNumber, int pageSize, int totalMemberCount, Func<IQuery<T>, IQuery<T>> additionalQueryFunc = null) : base()
23+
{
24+
var skip = (currentPageNumber - 1) * pageSize;
25+
var state = new ChloeQueryState<T>(query, currentPageNumber, pageSize, additionalQueryFunc);
26+
InitializeMetaInfo()(currentPageNumber)(pageSize)(totalMemberCount)(skip)();
27+
base._initializeAction = InitializeMemberList()(state)(pageSize)(skip);
28+
}
29+
30+
/// <summary>
31+
/// Get empty page
32+
/// </summary>
33+
/// <returns></returns>
34+
public static EmptyPage<T> Empty() => new EmptyPage<T>();
35+
36+
private Func<int, Func<int, Func<int, Func<int, Action>>>> InitializeMetaInfo() => c => s => t => k => () =>
37+
{
38+
// c = current page number
39+
// s = page size
40+
// t = total member count
41+
// k = skip
42+
var totalPageCount = (int)Math.Ceiling((double)t / (double)s);
43+
totalPageCount = totalPageCount < 0 ? 0 : totalPageCount;
44+
base.TotalPageCount = totalPageCount == 0 ? 1 : totalPageCount;
45+
base.TotalMemberCount = t;
46+
base.CurrentPageNumber = c;
47+
base.PageSize = s;
48+
base.CurrentPageSize = c == totalPageCount
49+
? k == 0
50+
? t
51+
: t % k
52+
: totalPageCount == 0
53+
? 0
54+
: s;
55+
56+
base.HasPrevious = c > 1;
57+
base.HasNext = c < base.TotalPageCount;
58+
};
59+
60+
private Func<ChloeQueryState<T>, Func<int, Func<int, Action>>> InitializeMemberList() => state => s => k => () =>
61+
{
62+
// s = page size
63+
// k = skip
64+
base._memberList = new List<IPageMember<T>>(s);
65+
for (var i = 0; i < s; i++)
66+
{
67+
base._memberList.Add(PageMemberFactory.Create<T>(state, i, ref k));
68+
}
69+
};
70+
}
71+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<Import Project="..\..\build\common.props" />
4+
5+
<PropertyGroup>
6+
<TargetFramework>netstandard2.0</TargetFramework>
7+
<AssemblyName>DotNetCore.Collections.Paginable.Chloe</AssemblyName>
8+
<PackageId>DotNetCore.Collections.Paginable.Chloe</PackageId>
9+
<Description>Paginable extension with Chloe for collection.</Description>
10+
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
11+
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
12+
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
13+
<RootNamespace>DotNetCore.Collections.Paginable</RootNamespace>
14+
</PropertyGroup>
15+
16+
<ItemGroup>
17+
<PackageReference Include="Chloe" Version="3.8.1" />
18+
</ItemGroup>
19+
20+
<ItemGroup>
21+
<ProjectReference Include="..\DotNetCore.Collections.Paginable\DotNetCore.Collections.Paginable.csproj" />
22+
</ItemGroup>
23+
24+
</Project>
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Chloe;
4+
using DotNetCore.Collections.Paginable.Internal;
5+
6+
// ReSharper disable once CheckNamespace
7+
namespace DotNetCore.Collections.Paginable
8+
{
9+
public static class SolidPageExtensions
10+
{
11+
/// <summary>
12+
/// Make original ChloeQueryable result to ChloePage collection.
13+
/// </summary>
14+
/// <typeparam name="T">element type of your enumerable result</typeparam>
15+
/// <param name="query">ChloeQueryable</param>
16+
/// <param name="limitedMemberCount">limited member count</param>
17+
/// <returns></returns>
18+
public static PaginableChloeQuery<T> ToPaginable<T>(this IQuery<T> query, int? limitedMemberCount = null)
19+
=> PaginableChloeCollFactory.CreatePageSet<T>(query, limitedMemberCount: limitedMemberCount);
20+
21+
/// <summary>
22+
/// Make original ChloeQueryable result to ChloePage collection.
23+
/// </summary>
24+
/// <typeparam name="T">element type of your enumerable result</typeparam>
25+
/// <param name="query">ChloeQueryable</param>
26+
/// <param name="pageSize">page size</param>
27+
/// <param name="limitedMemberCount">limited member count</param>
28+
/// <returns></returns>
29+
public static PaginableChloeQuery<T> ToPaginable<T>(this IQuery<T> query, int pageSize, int? limitedMemberCount = null)
30+
=> PaginableChloeCollFactory.CreatePageSet<T>(query, pageSize, limitedMemberCount);
31+
32+
/// <summary>
33+
/// Get specific page from original ChloeQueryable source
34+
/// </summary>
35+
/// <typeparam name="T">element type of your ChloeQueryable source</typeparam>
36+
/// <param name="query">original ChloeQueryable source</param>
37+
/// <param name="pageNumber">page number</param>
38+
/// <param name="additionalQueryFunc"></param>
39+
/// <returns></returns>
40+
public static IPage<T> GetPage<T>(this IQuery<T> query, int pageNumber, Func<IQuery<T>, IQuery<T>> additionalQueryFunc = null)
41+
=> GetPage<T>(query, pageNumber, PaginableSettingsManager.Settings.DefaultPageSize, additionalQueryFunc);
42+
43+
/// <summary>
44+
/// Get specific page from original ChloeQueryable source
45+
/// </summary>
46+
/// <typeparam name="T">element type of your ChloeQueryable source</typeparam>
47+
/// <param name="query">original ChloeQueryable source</param>
48+
/// <param name="pageNumber">page number</param>
49+
/// <param name="pageSize">page size</param>
50+
/// <param name="additionalQueryFunc"></param>
51+
/// <returns></returns>
52+
public static IPage<T> GetPage<T>(this IQuery<T> query, int pageNumber, int pageSize, Func<IQuery<T>, IQuery<T>> additionalQueryFunc = null)
53+
{
54+
if (query == null)
55+
{
56+
throw new ArgumentNullException(nameof(query), $"{nameof(query)} can not be null.");
57+
}
58+
59+
if (pageNumber < 0)
60+
{
61+
throw new IndexOutOfRangeException($"{nameof(pageNumber)} can not be less than zero");
62+
}
63+
64+
if (pageSize < 0)
65+
{
66+
throw new IndexOutOfRangeException($"{nameof(pageSize)} can not be less than zero");
67+
}
68+
69+
return new ChloePage<T>(query, pageNumber, pageSize, ChloeHelper.Count(query), additionalQueryFunc);
70+
}
71+
}
72+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Chloe;
2+
3+
namespace DotNetCore.Collections.Paginable.Internal
4+
{
5+
internal static class ChloeHelper
6+
{
7+
public static int Count<T>(IQuery<T> query) => query.Count();
8+
}
9+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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+
/// <summary>
9+
/// Chloe query state
10+
/// </summary>
11+
/// <typeparam name="T"></typeparam>
12+
public class ChloeQueryState<T> : IQueryEntryState<T>
13+
{
14+
private readonly Lazy<IEnumerable<T>> _mLazyChloeQueryMembers;
15+
16+
/// <summary>
17+
/// Chloe query state
18+
/// </summary>
19+
/// <param name="query"></param>
20+
/// <param name="currentPageNumber"></param>
21+
/// <param name="pageSize"></param>
22+
/// <param name="additionalQueryFunc"></param>
23+
public ChloeQueryState(IQuery<T> query, int currentPageNumber, int pageSize, Func<IQuery<T>, IQuery<T>> additionalQueryFunc = null)
24+
{
25+
if (query == null)
26+
{
27+
throw new ArgumentNullException(nameof(query));
28+
}
29+
30+
if (currentPageNumber < 0)
31+
{
32+
throw new ArgumentOutOfRangeException(nameof(currentPageNumber), $"{nameof(currentPageNumber)} can not be less than zero");
33+
}
34+
35+
if (pageSize < 0)
36+
{
37+
throw new ArgumentOutOfRangeException(nameof(pageSize), $"{nameof(pageSize)} can not be less than zero");
38+
}
39+
40+
InternalChloeQuery = query.TakePage(currentPageNumber, pageSize);
41+
_mLazyChloeQueryMembers = new Lazy<IEnumerable<T>>(() => (additionalQueryFunc?.Invoke(InternalChloeQuery) ?? InternalChloeQuery).ToList());
42+
}
43+
44+
private IQuery<T> InternalChloeQuery { get; set; }
45+
46+
/// <summary>
47+
/// Get all value.
48+
/// </summary>
49+
public IEnumerable<T> AllValue => _mLazyChloeQueryMembers.Value;
50+
}
51+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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 != null;
8+
}
9+
}
10+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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+
/// <summary>
11+
/// Get real member count<br />.
12+
/// first parameter(l) means limitedMemberCount<br />,
13+
/// second parameter(c) means count.
14+
/// </summary>
15+
/// <returns></returns>
16+
private static Func<int?, Func<int, int>> GetRealMemberCountFunc()
17+
=> l => c => l.IsValid() && l.HasValue ? l.Value > c ? c : l.Value : c;
18+
19+
/// <summary>
20+
/// Get real page count<br />.
21+
/// first parameter(m) means real member count, which has been getter from <see cref="GetRealMemberCountFunc"/><br />,
22+
/// second parameter(s) means page size.
23+
/// </summary>
24+
/// <returns></returns>
25+
private static Func<int, Func<int, int>> GetRealPageCountFunc()
26+
=> m => s => (int)Math.Ceiling((double)m / (double)s);
27+
28+
/// <summary>
29+
/// Make Chloe.Query`1 source to ChloePage collection.
30+
/// </summary>
31+
/// <typeparam name="T"></typeparam>
32+
/// <param name="query"></param>
33+
/// <param name="pageSize"></param>
34+
/// <param name="limitedMemberCount"></param>
35+
/// <returns></returns>
36+
public static PaginableChloeQuery<T> CreatePageSet<T>(IQuery<T> query, int? pageSize = null, int? limitedMemberCount = null)
37+
{
38+
if (query == null)
39+
{
40+
throw new ArgumentNullException(nameof(query));
41+
}
42+
43+
if (pageSize == null)
44+
{
45+
pageSize = PaginableSettingsManager.Settings.DefaultPageSize;
46+
}
47+
48+
var size = pageSize.Value;
49+
var realMemberCount = GetRealMemberCountFunc()(limitedMemberCount)(ChloeHelper.Count(query));
50+
var realPageCount = GetRealPageCountFunc()(realMemberCount)(size);
51+
52+
return limitedMemberCount.IsValid() && limitedMemberCount.HasValue
53+
? new PaginableChloeQuery<T>(query, size, realPageCount, realMemberCount, limitedMemberCount.Value)
54+
: new PaginableChloeQuery<T>(query, size, realPageCount, realMemberCount);
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)