Back-to-back GraphQL client using Linq-syntax
Using Package Manager:
Install-Package SmartGraphQLClientor
Using .NET CLI:
dotnet add package SmartGraphQLClientusing 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 | ❌ |