Тип динамического поля GraphQL.NET

Я пытаюсь добавить объект в свою модель GraphQL.NET, но у меня проблема с одним из полей. Исходный класс

public class ShowCriterion
{
    public string RelatedEntity { get; set; }
    public object MatchValue { get; set; }
}

Это материализованный путь (например, Person.Address.ZipCode), и сравнивает его с MatchValue. Проблема в том,MatchValue может быть довольно много разных вещей: boolean, int, string, List/array, DateTime и т. д.

Первой моей попыткой было создать класс GraphQL следующим образом:

    public partial class ShowCriterionQL : ObjectGraphType<ShowCriterion>
    {
        public ShowCriterionQL()
        {
            Field(x => x.RelatedEntity, type: typeof(StringGraphType));
            Field(x => x.MatchValue, type: typeof(ObjectGraphType));
        }
    }

Но это дает следующую ошибку:

GraphQL.Validation.ValidationError: Field matchValue of type ObjectGraphType must have a sub selection

Если я сделаю это StringGraphTypeон будет правильно преобразовывать некоторые значения (например, логическое значение true становится "True"), но мне действительно не нравится это решение, так как оно потребует специальной обработки на стороне клиента. Я также не исследовал все возможные типы, чтобы увидеть, что происходит с массивом или DateTime.

Есть ли способ сделать это в GraphQL.NET?

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

1 ответ

Вы можете использовать AnyScalarGraphType, но обратите внимание, что он не распознается клиентами graphql, хотя запрос с ним работает нормально при выполнении.

AnyScalarGraphType: https://github.com/graphql-dotnet/graphql-dotnet/blob/master/src/GraphQL/Utilities/Federation/AnyScalarGraphType.cs

Проблема с клиентом GraphQL: https://github.com/graphql/graphiql/issues/1705

Вы также можете создать собственный скалярный тип.

Другие вопросы по тегам