Тип динамического поля 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
Вы также можете создать собственный скалярный тип.