Hot Chocolate: queries, mutations, фильтрация, пагинация

↑ 5.3 GraphQL на бэкенде и Federation · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Практическая реализация 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/UseSortingwhere/order без ручного кода
UsePagingRelay-курсоры (edges, pageInfo)
Mutation conventionspayload с errors, единый шаблон
SubscriptionsWebSocket, топики (in-memory/Redis)
Authorization[Authorize] на полях

Нюансы и подводные камни

  • IQueryable наружу + фильтрация = клиент может строить дорогие запросы: ограничивайте поля фильтрации.
  • Ошибки бизнес-логики возвращайте типизированно (union/errors), не исключениями.
  • Ограничьте MaxPageSize, глубину и стоимость (см. Безопасность GraphQL: глубина, сложность, персистентные запросы).
  • Сопоставляйте DTO и схему, чтобы изменения БД не ломали контракт.
  • Мутации выполняются последовательно, запросы — параллельно.

Практика

  1. Подключите Hot Chocolate к EF Core с проекциями и фильтрами.
  2. Реализуйте мутацию с типизированными ошибками.
  3. Настройте подписку на изменения заказа через Redis.

Вопросы с ответами

Связанные темы