Skip to content

Commit 13c074d

Browse files
authored
Request totalCount through ToPageAsync if its requested. (#8011)
1 parent 73be31d commit 13c074d

13 files changed

+315
-95
lines changed

src/GreenDonut/GreenDonut.sln

Lines changed: 85 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,85 @@
1-
2-
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 17
4-
VisualStudioVersion = 17.0.31903.59
5-
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3697CA1D-4F24-491C-8C89-F17CBB63F8BC}"
7-
EndProject
8-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut", "src\GreenDonut\GreenDonut.csproj", "{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}"
9-
EndProject
10-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Abstractions", "src\GreenDonut.Abstractions\GreenDonut.Abstractions.csproj", "{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}"
11-
EndProject
12-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data", "src\GreenDonut.Data\GreenDonut.Data.csproj", "{2A37845A-EDC7-4A32-8103-2D86448F314D}"
13-
EndProject
14-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.Abstractions", "src\GreenDonut.Data.Abstractions\GreenDonut.Data.Abstractions.csproj", "{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}"
15-
EndProject
16-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.EntityFramework", "src\GreenDonut.Data.EntityFramework\GreenDonut.Data.EntityFramework.csproj", "{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}"
17-
EndProject
18-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.Primitives", "src\GreenDonut.Data.Primitives\GreenDonut.Data.Primitives.csproj", "{211F2EF0-2E15-4C58-B195-3E7665558645}"
19-
EndProject
20-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}"
21-
EndProject
22-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Tests", "test\GreenDonut.Tests\GreenDonut.Tests.csproj", "{61879EC3-D0DC-4743-890A-6EE19D43E81B}"
23-
EndProject
24-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.EntityFramework.Tests", "test\GreenDonut.Data.EntityFramework.Tests\GreenDonut.Data.EntityFramework.Tests.csproj", "{72C43DC2-194C-4493-8673-938AF0BC3336}"
25-
EndProject
26-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.Tests", "test\GreenDonut.Data.Tests\GreenDonut.Data.Tests.csproj", "{28AA2DCE-F97B-431F-90E7-B4D4F4636430}"
27-
EndProject
28-
Global
29-
GlobalSection(SolutionConfigurationPlatforms) = preSolution
30-
Debug|Any CPU = Debug|Any CPU
31-
Release|Any CPU = Release|Any CPU
32-
EndGlobalSection
33-
GlobalSection(SolutionProperties) = preSolution
34-
HideSolutionNode = FALSE
35-
EndGlobalSection
36-
GlobalSection(ProjectConfigurationPlatforms) = postSolution
37-
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
38-
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Debug|Any CPU.Build.0 = Debug|Any CPU
39-
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Release|Any CPU.ActiveCfg = Release|Any CPU
40-
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Release|Any CPU.Build.0 = Release|Any CPU
41-
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
42-
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
43-
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
44-
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Release|Any CPU.Build.0 = Release|Any CPU
45-
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
46-
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Debug|Any CPU.Build.0 = Debug|Any CPU
47-
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Release|Any CPU.ActiveCfg = Release|Any CPU
48-
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Release|Any CPU.Build.0 = Release|Any CPU
49-
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
50-
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Debug|Any CPU.Build.0 = Debug|Any CPU
51-
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Release|Any CPU.ActiveCfg = Release|Any CPU
52-
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Release|Any CPU.Build.0 = Release|Any CPU
53-
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
54-
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
55-
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
56-
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Release|Any CPU.Build.0 = Release|Any CPU
57-
{211F2EF0-2E15-4C58-B195-3E7665558645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
58-
{211F2EF0-2E15-4C58-B195-3E7665558645}.Debug|Any CPU.Build.0 = Debug|Any CPU
59-
{211F2EF0-2E15-4C58-B195-3E7665558645}.Release|Any CPU.ActiveCfg = Release|Any CPU
60-
{211F2EF0-2E15-4C58-B195-3E7665558645}.Release|Any CPU.Build.0 = Release|Any CPU
61-
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
62-
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Debug|Any CPU.Build.0 = Debug|Any CPU
63-
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Release|Any CPU.ActiveCfg = Release|Any CPU
64-
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Release|Any CPU.Build.0 = Release|Any CPU
65-
{72C43DC2-194C-4493-8673-938AF0BC3336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
66-
{72C43DC2-194C-4493-8673-938AF0BC3336}.Debug|Any CPU.Build.0 = Debug|Any CPU
67-
{72C43DC2-194C-4493-8673-938AF0BC3336}.Release|Any CPU.ActiveCfg = Release|Any CPU
68-
{72C43DC2-194C-4493-8673-938AF0BC3336}.Release|Any CPU.Build.0 = Release|Any CPU
69-
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
70-
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Debug|Any CPU.Build.0 = Debug|Any CPU
71-
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Release|Any CPU.ActiveCfg = Release|Any CPU
72-
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Release|Any CPU.Build.0 = Release|Any CPU
73-
EndGlobalSection
74-
GlobalSection(NestedProjects) = preSolution
75-
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
76-
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
77-
{2A37845A-EDC7-4A32-8103-2D86448F314D} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
78-
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
79-
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
80-
{211F2EF0-2E15-4C58-B195-3E7665558645} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
81-
{61879EC3-D0DC-4743-890A-6EE19D43E81B} = {26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}
82-
{72C43DC2-194C-4493-8673-938AF0BC3336} = {26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}
83-
{28AA2DCE-F97B-431F-90E7-B4D4F4636430} = {26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}
84-
EndGlobalSection
85-
EndGlobal
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.0.31903.59
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3697CA1D-4F24-491C-8C89-F17CBB63F8BC}"
7+
EndProject
8+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut", "src\GreenDonut\GreenDonut.csproj", "{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}"
9+
EndProject
10+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Abstractions", "src\GreenDonut.Abstractions\GreenDonut.Abstractions.csproj", "{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}"
11+
EndProject
12+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data", "src\GreenDonut.Data\GreenDonut.Data.csproj", "{2A37845A-EDC7-4A32-8103-2D86448F314D}"
13+
EndProject
14+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.Abstractions", "src\GreenDonut.Data.Abstractions\GreenDonut.Data.Abstractions.csproj", "{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}"
15+
EndProject
16+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.EntityFramework", "src\GreenDonut.Data.EntityFramework\GreenDonut.Data.EntityFramework.csproj", "{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}"
17+
EndProject
18+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.Primitives", "src\GreenDonut.Data.Primitives\GreenDonut.Data.Primitives.csproj", "{211F2EF0-2E15-4C58-B195-3E7665558645}"
19+
EndProject
20+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}"
21+
EndProject
22+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Tests", "test\GreenDonut.Tests\GreenDonut.Tests.csproj", "{61879EC3-D0DC-4743-890A-6EE19D43E81B}"
23+
EndProject
24+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.EntityFramework.Tests", "test\GreenDonut.Data.EntityFramework.Tests\GreenDonut.Data.EntityFramework.Tests.csproj", "{72C43DC2-194C-4493-8673-938AF0BC3336}"
25+
EndProject
26+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GreenDonut.Data.Tests", "test\GreenDonut.Data.Tests\GreenDonut.Data.Tests.csproj", "{28AA2DCE-F97B-431F-90E7-B4D4F4636430}"
27+
EndProject
28+
Global
29+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
30+
Debug|Any CPU = Debug|Any CPU
31+
Release|Any CPU = Release|Any CPU
32+
EndGlobalSection
33+
GlobalSection(SolutionProperties) = preSolution
34+
HideSolutionNode = FALSE
35+
EndGlobalSection
36+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
37+
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
38+
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Debug|Any CPU.Build.0 = Debug|Any CPU
39+
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Release|Any CPU.ActiveCfg = Release|Any CPU
40+
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D}.Release|Any CPU.Build.0 = Release|Any CPU
41+
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
42+
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
43+
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
44+
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB}.Release|Any CPU.Build.0 = Release|Any CPU
45+
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
46+
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Debug|Any CPU.Build.0 = Debug|Any CPU
47+
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Release|Any CPU.ActiveCfg = Release|Any CPU
48+
{2A37845A-EDC7-4A32-8103-2D86448F314D}.Release|Any CPU.Build.0 = Release|Any CPU
49+
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
50+
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Debug|Any CPU.Build.0 = Debug|Any CPU
51+
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Release|Any CPU.ActiveCfg = Release|Any CPU
52+
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06}.Release|Any CPU.Build.0 = Release|Any CPU
53+
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
54+
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
55+
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
56+
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA}.Release|Any CPU.Build.0 = Release|Any CPU
57+
{211F2EF0-2E15-4C58-B195-3E7665558645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
58+
{211F2EF0-2E15-4C58-B195-3E7665558645}.Debug|Any CPU.Build.0 = Debug|Any CPU
59+
{211F2EF0-2E15-4C58-B195-3E7665558645}.Release|Any CPU.ActiveCfg = Release|Any CPU
60+
{211F2EF0-2E15-4C58-B195-3E7665558645}.Release|Any CPU.Build.0 = Release|Any CPU
61+
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
62+
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Debug|Any CPU.Build.0 = Debug|Any CPU
63+
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Release|Any CPU.ActiveCfg = Release|Any CPU
64+
{61879EC3-D0DC-4743-890A-6EE19D43E81B}.Release|Any CPU.Build.0 = Release|Any CPU
65+
{72C43DC2-194C-4493-8673-938AF0BC3336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
66+
{72C43DC2-194C-4493-8673-938AF0BC3336}.Debug|Any CPU.Build.0 = Debug|Any CPU
67+
{72C43DC2-194C-4493-8673-938AF0BC3336}.Release|Any CPU.ActiveCfg = Release|Any CPU
68+
{72C43DC2-194C-4493-8673-938AF0BC3336}.Release|Any CPU.Build.0 = Release|Any CPU
69+
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
70+
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Debug|Any CPU.Build.0 = Debug|Any CPU
71+
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Release|Any CPU.ActiveCfg = Release|Any CPU
72+
{28AA2DCE-F97B-431F-90E7-B4D4F4636430}.Release|Any CPU.Build.0 = Release|Any CPU
73+
EndGlobalSection
74+
GlobalSection(NestedProjects) = preSolution
75+
{D596ABFF-2B7E-42A1-ABF9-ECCE2C4E656D} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
76+
{7FD1006E-CB9A-4EC2-BCCC-7EF412B062EB} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
77+
{2A37845A-EDC7-4A32-8103-2D86448F314D} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
78+
{5F62F5E4-A450-4533-A0CF-64CE62F3DD06} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
79+
{BA537BF3-3B52-42C9-9608-4EE7C1ACB0BA} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
80+
{211F2EF0-2E15-4C58-B195-3E7665558645} = {3697CA1D-4F24-491C-8C89-F17CBB63F8BC}
81+
{61879EC3-D0DC-4743-890A-6EE19D43E81B} = {26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}
82+
{72C43DC2-194C-4493-8673-938AF0BC3336} = {26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}
83+
{28AA2DCE-F97B-431F-90E7-B4D4F4636430} = {26D53CCB-1C96-4160-B9F6-F8A6A7207EDD}
84+
EndGlobalSection
85+
EndGlobal

src/GreenDonut/src/GreenDonut.Data.EntityFramework/Extensions/PagingQueryableExtensions.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static async ValueTask<Page<T>> ToPageAsync<T>(
4343
this IQueryable<T> source,
4444
PagingArguments arguments,
4545
CancellationToken cancellationToken = default)
46-
=> await source.ToPageAsync(arguments, includeTotalCount: false, cancellationToken);
46+
=> await source.ToPageAsync(arguments, includeTotalCount: arguments.IncludeTotalCount, cancellationToken);
4747

4848
/// <summary>
4949
/// Executes a query with paging and returns the selected page.
@@ -212,7 +212,12 @@ public static ValueTask<Dictionary<TKey, Page<TValue>>> ToBatchPageAsync<TKey, T
212212
PagingArguments arguments,
213213
CancellationToken cancellationToken = default)
214214
where TKey : notnull
215-
=> ToBatchPageAsync<TKey, TValue, TValue>(source, keySelector, t => t, arguments, cancellationToken);
215+
=> ToBatchPageAsync<TKey, TValue, TValue>(
216+
source,
217+
keySelector,
218+
t => t,
219+
arguments,
220+
cancellationToken);
216221

217222
/// <summary>
218223
/// Executes a batch query with paging and returns the selected pages for each parent.
@@ -295,7 +300,13 @@ public static ValueTask<Dictionary<TKey, Page<TValue>>> ToBatchPageAsync<TKey, T
295300
PagingArguments arguments,
296301
CancellationToken cancellationToken = default)
297302
where TKey : notnull
298-
=> ToBatchPageAsync(source, keySelector, valueSelector, arguments, includeTotalCount: false, cancellationToken);
303+
=> ToBatchPageAsync(
304+
source,
305+
keySelector,
306+
valueSelector,
307+
arguments,
308+
includeTotalCount: arguments.IncludeTotalCount,
309+
cancellationToken);
299310

300311
/// <summary>
301312
/// Executes a batch query with paging and returns the selected pages for each parent.

src/GreenDonut/src/GreenDonut.Data.Primitives/PagingArguments.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,21 @@ public readonly record struct PagingArguments
2020
/// <param name="before">
2121
/// The cursor before which entities shall be taken.
2222
/// </param>
23+
/// <param name="includeTotalCount">
24+
/// Defines if the total count of items in the dataset shall be included in the result.
25+
/// </param>
2326
public PagingArguments(
2427
int? first = null,
2528
string? after = null,
2629
int? last = null,
27-
string? before = null)
30+
string? before = null,
31+
bool includeTotalCount = false)
2832
{
2933
First = first;
3034
After = after;
3135
Last = last;
3236
Before = before;
37+
IncludeTotalCount = includeTotalCount;
3338
}
3439

3540
/// <summary>
@@ -52,6 +57,11 @@ public PagingArguments(
5257
/// </summary>
5358
public string? Before { get; init; }
5459

60+
/// <summary>
61+
/// Defines if the total count of items in the dataset shall be included in the result.
62+
/// </summary>
63+
public bool IncludeTotalCount { get; init; }
64+
5565
/// <summary>
5666
/// Deconstructs the paging arguments into its components.
5767
/// </summary>
@@ -67,15 +77,20 @@ public PagingArguments(
6777
/// <param name="before">
6878
/// The cursor before which entities shall be taken.
6979
/// </param>
80+
/// <param name="includeTotalCount">
81+
/// Defines if the total count of items in the dataset shall be included in the result.
82+
/// </param>
7083
public void Deconstruct(
7184
out int? first,
7285
out string? after,
7386
out int? last,
74-
out string? before)
87+
out string? before,
88+
out bool includeTotalCount)
7589
{
7690
first = First;
7791
after = After;
7892
last = Last;
7993
before = Before;
94+
includeTotalCount = IncludeTotalCount;
8095
}
8196
}

src/GreenDonut/src/GreenDonut/GreenDonut.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
</ItemGroup>
2828

2929
<ItemGroup>
30-
<ProjectReference Include="..\Data.Primitives\GreenDonut.Abstractions.csproj" />
3130
<ProjectReference Include="..\GreenDonut.Abstractions\GreenDonut.Abstractions.csproj" />
3231
</ItemGroup>
3332

src/HotChocolate/Core/src/Types/Types/Pagination/PagingHelper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ private static void ApplyConfiguration(
6868

6969
var index = definition.MiddlewareDefinitions.IndexOf(placeholder);
7070
definition.MiddlewareDefinitions[index] = new(middleware, key: Paging);
71+
definition.ContextData[WellKnownContextData.PagingOptions] = options;
7172
}
7273

7374
private static IExtendedType GetSourceType(

src/HotChocolate/Data/src/Data/Pagination/PagingArgumentsParameterExpressionBuilder.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using GreenDonut.Data;
2+
using HotChocolate.Execution.Processing;
23
using HotChocolate.Internal;
34
using HotChocolate.Resolvers;
45
using HotChocolate.Types.Pagination;
@@ -21,8 +22,22 @@ public T Execute<T>(IResolverContext context)
2122
=> (T)(object)MapArguments(context);
2223

2324
private static PagingArguments MapArguments(IResolverContext context)
24-
=> MapArguments(context.GetLocalState<CursorPagingArguments>(WellKnownContextData.PagingArguments));
25+
{
26+
var pagingArguments = context.GetLocalState<CursorPagingArguments>(WellKnownContextData.PagingArguments);
27+
var includeTotalCount = IncludeTotalCount(context.Selection);
2528

26-
private static PagingArguments MapArguments(CursorPagingArguments arguments)
27-
=> new(arguments.First, arguments.After, arguments.Last, arguments.Before);
29+
if (includeTotalCount)
30+
{
31+
includeTotalCount = context.IsSelected("totalCount");
32+
}
33+
34+
return MapArguments(pagingArguments, includeTotalCount);
35+
}
36+
37+
private static PagingArguments MapArguments(CursorPagingArguments arguments, bool includeTotalCount)
38+
=> new(arguments.First, arguments.After, arguments.Last, arguments.Before, includeTotalCount);
39+
40+
private static bool IncludeTotalCount(ISelection selection)
41+
=> selection.Field.ContextData.TryGetValue(WellKnownContextData.PagingOptions, out var options)
42+
&& options is PagingOptions { IncludeTotalCount: true };
2843
}

src/HotChocolate/Data/test/Data.PostgreSQL.Tests/IntegrationTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,54 @@ public async Task Query_Products_First_2_And_Brand()
237237
MatchSnapshot(result, interceptor);
238238
}
239239

240+
[Fact]
241+
public async Task Query_Products_Include_TotalCount()
242+
{
243+
// arrange
244+
using var interceptor = new TestQueryInterceptor();
245+
246+
// act
247+
var result = await ExecuteAsync(
248+
"""
249+
{
250+
products(first: 2) {
251+
nodes {
252+
name
253+
}
254+
totalCount
255+
}
256+
}
257+
258+
""",
259+
interceptor);
260+
261+
// assert
262+
MatchSnapshot(result, interceptor);
263+
}
264+
265+
[Fact]
266+
public async Task Query_Products_Exclude_TotalCount()
267+
{
268+
// arrange
269+
using var interceptor = new TestQueryInterceptor();
270+
271+
// act
272+
var result = await ExecuteAsync(
273+
"""
274+
{
275+
products(first: 2) {
276+
nodes {
277+
name
278+
}
279+
}
280+
}
281+
282+
""",
283+
interceptor);
284+
285+
// assert
286+
MatchSnapshot(result, interceptor);
287+
}
240288

241289
private static ServiceProvider CreateServer(string connectionString)
242290
{

src/HotChocolate/Data/test/Data.PostgreSQL.Tests/Types/Products/ProductQueries.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace HotChocolate.Data.Types.Products;
1010
[QueryType]
1111
public static partial class ProductQueries
1212
{
13-
[UsePaging]
13+
[UsePaging(IncludeTotalCount = true)]
1414
[UseFiltering]
1515
[UseSorting]
1616
public static async Task<Connection<Product>> GetProductsAsync(

src/HotChocolate/Data/test/Data.PostgreSQL.Tests/__snapshots__/IntegrationTests.CreateSchema.graphql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ type ProductsConnection {
7575
edges: [ProductsEdge!]
7676
"A flattened list of the nodes."
7777
nodes: [Product!]
78+
"Identifies the total count of items in the connection."
79+
totalCount: Int! @cost(weight: "10")
7880
}
7981

8082
"An edge in a connection."

0 commit comments

Comments
 (0)