Skip to content

Commit 06efe26

Browse files
committed
moved total-pages and total-count to Entity Framework specific subclass.
reduced the number of count calls to save roundtrips
1 parent 370365b commit 06efe26

5 files changed

Lines changed: 62 additions & 10 deletions

File tree

JSONAPI.AcceptanceTests.EntityFrameworkTestWebApp/Startup.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
using JSONAPI.EntityFramework.Configuration;
1515
using Owin;
1616
using System.Collections.Generic;
17+
using JSONAPI.Documents.Builders;
18+
using JSONAPI.EntityFramework.Documents.Builders;
1719

1820
namespace JSONAPI.AcceptanceTests.EntityFrameworkTestWebApp
1921
{
@@ -112,6 +114,8 @@ internal JsonApiHttpAutofacConfigurator BuildAutofacConfigurator(IAppBuilder app
112114
builder.RegisterType<CustomEntityFrameworkResourceObjectMaterializer>()
113115
.As<IEntityFrameworkResourceObjectMaterializer>();
114116
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
117+
builder.RegisterType<EntityFrameworkQueryableResourceCollectionDocumentBuilder>().As<IQueryableResourceCollectionDocumentBuilder>();
118+
115119
});
116120
configurator.OnApplicationLifetimeScopeBegun(applicationLifetimeScope =>
117121
{
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System;
2+
using System.Data.Entity;
3+
using System.Linq;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using JSONAPI.Documents;
7+
using JSONAPI.Documents.Builders;
8+
using JSONAPI.Http;
9+
using JSONAPI.QueryableTransformers;
10+
11+
namespace JSONAPI.EntityFramework.Documents.Builders
12+
{
13+
/// <summary>
14+
/// Provides a entity framework implementation of an IQueryableResourceCollectionDocumentBuilder
15+
/// </summary>
16+
public class EntityFrameworkQueryableResourceCollectionDocumentBuilder: DefaultQueryableResourceCollectionDocumentBuilder
17+
{
18+
/// <summary>
19+
/// Creates a new EntityFrameworkQueryableResourceCollectionDocumentBuilder
20+
/// </summary>
21+
public EntityFrameworkQueryableResourceCollectionDocumentBuilder(
22+
IResourceCollectionDocumentBuilder resourceCollectionDocumentBuilder,
23+
IQueryableEnumerationTransformer enumerationTransformer,
24+
IQueryableFilteringTransformer filteringTransformer,
25+
IQueryableSortingTransformer sortingTransformer,
26+
IQueryablePaginationTransformer paginationTransformer,
27+
IBaseUrlService baseUrlService) :
28+
base(resourceCollectionDocumentBuilder,
29+
enumerationTransformer,
30+
filteringTransformer,
31+
sortingTransformer,
32+
paginationTransformer,
33+
baseUrlService)
34+
{
35+
}
36+
37+
/// <summary>
38+
/// Returns the metadata that should be sent with this document.
39+
/// </summary>
40+
protected override async Task<IMetadata> GetDocumentMetadata<T>(IQueryable<T> originalQuery, IQueryable<T> filteredQuery, IOrderedQueryable<T> sortedQuery,
41+
IPaginationTransformResult<T> paginationResult, CancellationToken cancellationToken)
42+
{
43+
var metadata = new Metadata();
44+
if (paginationResult.PaginationWasApplied)
45+
{
46+
var count = filteredQuery.CountAsync(cancellationToken);
47+
metadata.MetaObject.Add("total-pages", (int)Math.Ceiling((decimal) await count / paginationResult.PageSize));
48+
metadata.MetaObject.Add("total-count", await count);
49+
}
50+
if (metadata.MetaObject.HasValues)
51+
return metadata;
52+
return null;
53+
}
54+
}
55+
}

JSONAPI.EntityFramework/JSONAPI.EntityFramework.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
<ItemGroup>
7373
<Compile Include="ActionFilters\AsynchronousEnumerationTransformer.cs" />
7474
<Compile Include="DbContextExtensions.cs" />
75+
<Compile Include="Documents\Builders\EntityFrameworkQueryableResourceCollectionDocumentBuilder.cs" />
7576
<Compile Include="Http\EntityFrameworkDocumentMaterializer.cs" />
7677
<Compile Include="EntityFrameworkPluralizationService.cs" />
7778
<Compile Include="Http\EntityFrameworkToOneRelatedResourceDocumentMaterializer.cs" />

JSONAPI/Documents/Builders/DefaultQueryableResourceCollectionDocumentBuilder.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
using System;
2-
using System.Linq;
1+
using System.Linq;
32
using System.Net.Http;
43
using System.Threading;
54
using System.Threading.Tasks;
65
using JSONAPI.Http;
76
using JSONAPI.QueryableTransformers;
8-
using Newtonsoft.Json.Linq;
97

108
namespace JSONAPI.Documents.Builders
119
{
@@ -62,13 +60,6 @@ public async Task<IResourceCollectionDocument> BuildDocument<T>(IQueryable<T> qu
6260
protected virtual Task<IMetadata> GetDocumentMetadata<T>(IQueryable<T> originalQuery, IQueryable<T> filteredQuery, IOrderedQueryable<T> sortedQuery,
6361
IPaginationTransformResult<T> paginationResult, CancellationToken cancellationToken)
6462
{
65-
var metadata = new Metadata();
66-
if (paginationResult.PaginationWasApplied) {
67-
metadata.MetaObject.Add("total-pages", (int)Math.Ceiling((decimal)filteredQuery.Count() / paginationResult.PageSize));
68-
metadata.MetaObject.Add("total-count", filteredQuery.Count());
69-
}
70-
if (metadata.MetaObject.HasValues)
71-
return Task.FromResult((IMetadata)metadata);
7263
return Task.FromResult((IMetadata) null);
7364
}
7465
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,5 +146,6 @@ configuration.CustomBaseUrlService = new BaseUrlService(new Uri("https://api.exa
146146
## Pagination
147147

148148
### total-pages / total-count
149+
When using Entity Framework you can register type `EntityFrameworkQueryableResourceCollectionDocumentBuilder` to enable the `total-pages` and `total-count` meta properties.
149150
When pagination is used the `total-pages` and `total-count` meta properties are provided to indicate the number of pages and records to the client.
150151

0 commit comments

Comments
 (0)