Вычисляемые и внешние данные.

1) Используя механизм

Extending Types
https://chillicream.com/docs/hotchocolate/v13/defining-a-schema/extending-types

можно добавить к сущности дополнительные поля, при этом также есть возможность указать кастомную логику заполнения полей (Resolver).
Т.е. данные механизм можно использовать, чтобы сделать вычисляемый столбец и (или) столбец с данными на основе внешнего источника данных (например данных, которые не соединяются напрямую или же загружаются из внешнего web api).

public static void AddScalarResolver<TEntity, TType, TResolverType>(
   this IObjectTypeDescriptor<TEntity> descriptor,
   string fieldName
    )
   // Самодельный интерфейс для удобства, его нет в фреймворке.
   where TResolverType : IDataResolver<TType>
{
    descriptor
        .Field(fieldName)
        .Type<ScalarType<TType>>()
        .ResolveWith<TResolverType>(
            e => e.LoadAsync(default!, default)
            );
}

2) Добавив к вышеуказанному решению механизм

DataLoader
https://chillicream.com/docs/hotchocolate/v13/fetching-data/dataloader

а именно BatchDataLoader, можно оптимизировать запросы и вычисления.
Есть возможность выполнить пакетную обработку, выполнив предварительное извлечение всех необходимых параметров
(правда в виде одного объекта строки, но можно использовать сериализацию или отдельный типизированный объект-хранилище в сочетании с типом регистрации Scoped),
в рамках обработки одного входящего запроса.


3) При всех вышеуказанном, мы можем использовать в качестве сущности БД из EntityFramework | EntityFrameworkCore контекста, при этом имея встроенный механизм выборки IQurable.

Асинхронное выполнение запросов.

async await.
Произведя некоторое изучение поведения фреймворка было обнаружено, что при конфигурации контракта важно возвращать именно IAsyncEnumerable<T>, а не IQueryable<T> (DbSet<T> напрямую). Если этого не сделать, то фреймворк будет загружать данные из БД синхронно, не используя IAsyncEnumerator<T>.

UPD1: поведение наблюдается в некоторых версиях 12.*, в версии 13 поведение отличается. Но не все изучил до конца.

  
ТестированиеGraphQL - How to write integration tests against Hot Chocolate
https://chillicream.com/blog/2019/04/11/integration-tests
Теги: