Hot Chocolate: queries, mutations, фильтрация, пагинация
↑ 5.3 GraphQL на бэкенде и Federation · ← Предыдущая · → Следующая
Зачем это на собесе
Практическая реализация GraphQL на .NET: подход code-first и встроенные возможности.
Объяснение
Hot Chocolate — основной GraphQL-сервер для .NET.
builder.Services
.AddGraphQLServer()
.AddQueryType<Query>()
.AddMutationType<Mutation>()
.AddProjections().AddFiltering().AddSorting()
.AddDataLoader<CustomerByIdDataLoader>()
.ModifyRequestOptions(o => o.IncludeExceptionDetails = builder.Environment.IsDevelopment());
app.MapGraphQL();
public class Query
{
[UsePaging(MaxPageSize = 50, IncludeTotalCount = true)]
[UseProjection, UseFiltering, UseSorting]
public IQueryable<Order> GetOrders(AppDbContext db) => db.Orders; // EF: SQL строится по запросу клиента
}
public class Mutation
{
public async Task<Order> CancelOrder(Guid id, [Service] IOrderService svc, CancellationToken ct)
=> await svc.CancelAsync(id, ct);
}| Возможность | Что даёт |
|---|---|
UseProjection | выбираются только запрошенные колонки |
UseFiltering/UseSorting | where/order без ручного кода |
UsePaging | Relay-курсоры (edges, pageInfo) |
| Mutation conventions | payload с errors, единый шаблон |
| Subscriptions | WebSocket, топики (in-memory/Redis) |
| Authorization | [Authorize] на полях |
Нюансы и подводные камни
IQueryableнаружу + фильтрация = клиент может строить дорогие запросы: ограничивайте поля фильтрации.- Ошибки бизнес-логики возвращайте типизированно (union/errors), не исключениями.
- Ограничьте
MaxPageSize, глубину и стоимость (см. Безопасность GraphQL: глубина, сложность, персистентные запросы). - Сопоставляйте DTO и схему, чтобы изменения БД не ломали контракт.
- Мутации выполняются последовательно, запросы — параллельно.
Практика
- Подключите Hot Chocolate к EF Core с проекциями и фильтрами.
- Реализуйте мутацию с типизированными ошибками.
- Настройте подписку на изменения заказа через Redis.
Вопросы с ответами
Что делает UseProjection?
Транслирует выбранные клиентом поля в
SelectEF, чтобы читать только нужные колонки.
Как возвращать ошибки мутаций?
Через payload с полем ошибок (mutation conventions) вместо генерации исключений.