Back-to-back GraphQL client using Linq-syntax
Using Package Manager:
Install-Package SmartGraphQLClient
or
Using .NET CLI:
dotnet add package SmartGraphQLClient
using SmartGraphQLClient;
services.AddSmartGraphQLClient();
using SmartGraphQLClient;
GraphQLHttpClient client = ... // from DI
var users = await client.Query<UserModel>("users")
.Include(x => x.Roles)
.ThenInclude(x => x.Users)
.Where(x => x.UserName.StartsWith("A") || x.Roles.Any(r => r.Code == RoleCode.ADMINISTRATOR))
.OrderBy(x => x.Id)
.ThenByDescending(x => x.UserName)
.Select(x => new
{
x.Id,
Name = x.UserName,
x.Roles,
IsAdministrator = x.Roles.Any(r => r.Code == RoleCode.ADMINISTRATOR)
})
.Skip(5)
.Take(10)
.Argument("secretKey", "1234")
.ToListAsync();
When you call materializing method (ToListAsync()
, ToArrayAsync()
, FirstAsync()
, etc.), the GraphQLHttpClient
will build a string query and send it to the GraphQL-server, get a response and materialize the result.
Query-string from example:
{
users (
where: {
or: [
{ userName: { startsWith: "A" } }
{ roles: { some: { code: { eq: ADMINISTRATOR } } } }
]
}
order: [
{ id: ASC }
{ userName: DESC }
]
skip: 5
take: 10
secretKey: "1234"
) {
id
userName
roles {
code
name
description
id
users {
userName
age
id
}
}
}
}
See more examples in unit-tests directory:
- more requests (
ToListAsync()
,ToPageAsync()
,FirstOrDefaultAsync()
) - attributes (
GraphQLEndpointAttribute
,GraphQLIgnoreAttribute
,GraphQLPropertyNameAttribute
) - authorized graphql-http-client (
IGraphQLAuthorizationService<>
for providing tokens in runtime and cache tokens) - and more
Requests were tested on HotChocolate GraphQL-server. See their documentation.
feature's name | package's version | |
---|---|---|
Build Where-string | 1.0.0 | ✅ |
Build Select-string | 1.0.0 | ✅ |
Build Order-string | 1.0.0 | ✅ |
Offset paging (skip, take) | 1.0.0 | ✅ |
Custom arguments | 1.0.0 | ✅ |
Execute raw query | 1.1.0 | ✅ |
Cursor paging | ❌ |