Я изучаю, как использовать CustomScalar в graphql-dotnet.
У меня есть столбец tinyint в моей таблице, и, судя по тому, что я прочитал, я должен использовать байт в этом столбце в С#. После исследования я обнаружил, что мне нужно создать ByteGraphType, но у меня проблемы с этим.
Я получил пример ByteGraphType по этой ссылке https://github.com/graphql-dotnet/graphql-dotnet/issues/458, так что я думаю, что он будет работать.
С помощью этого кода я могу запросить таблицу, однако моя мутация не работает. Я не нашел примера, демонстрирующего, как будет выглядеть мутация с байтовым столбцом. Я попытался, как указано в моем примере кода, но в этой строке (var avaliacao = context.GetArgument("avaliacao");) мой аргумент avaliacao.Nota возвращает значение null, и я не уверен, что делать дальше.
Кто-нибудь может мне помочь?
Спасибо
ЭТО МОЙ КОД
//Модель
[Column("nota")]
public byte Nota { get; set; }
//Тип
Field<ByteGraphType>("Nota", resolve: context => context.Source.Nota);
//Тип ввода
Field<ByteGraphType>("nota");
//Запрос
Field<ListGraphType<AvaliacaoType>>(
"avaliacoes",
resolve: context => contextServiceLocator.AvaliacaoRepository.All());
// Мутация
Field<AvaliacaoType>(
"createAvaliacao",
arguments: new QueryArguments(
new QueryArgument<NonNullGraphType<AvaliacaoInputType>> { Name = "avaliacao" }
),
resolve: context =>
{
var schema = new Schema();
schema.RegisterValueConverter(new ByteValueConverter());
var avaliacao = context.GetArgument<Avaliacao>("avaliacao");
avaliacao.Nota.AstFromValue(schema, new ByteGraphType());
return contextServiceLocator.AvaliacaoRepository.Add(avaliacao);
});
//ByteGraphType
using GraphQL.Language.AST;
using GraphQL.Types;
using System;
namespace Api.Helpers
{
public class ByteGraphType : ScalarGraphType
{
public ByteGraphType()
{
Name = "Byte";
}
public override object ParseLiteral(IValue value)
{
var byteVal = value as ByteValue;
return byteVal?.Value;
}
public override object ParseValue(object value)
{
if (value == null)
return null;
try
{
var result = Convert.ToByte(value);
return result;
}
catch (FormatException)
{
return null;
}
}
public override object Serialize(object value)
{
return ParseValue(value).ToString();
}
public class ByteValueConverter : IAstFromValueConverter
{
public bool Matches(object value, IGraphType type)
{
return value is byte;
}
public IValue Convert(object value, IGraphType type)
{
return new ByteValue((byte)value);
}
}
public class ByteValue : ValueNode<byte>
{
public ByteValue(byte value)
{
Value = value;
}
protected override bool Equals(ValueNode<byte> node)
{
return Value == node.Value;
}
}
}
}
Мне нужно иметь возможность сохранить запись таблицы со столбцом tinyint. Если я изменю тип в своем коде на int, я смогу изменить его, но не смогу выполнить запрос.





Я изменил свой CustomScalar, и это сработало:
using GraphQL.Language.AST;
using GraphQL.Types;
using System;
namespace Api.Helpers
{
public class ByteGraphType : ScalarGraphType
{
public ByteGraphType()
{
Name = "Byte";
Description = "ByteGraphType";
}
/// <inheritdoc />
public override object Serialize(object value)
{
return ParseValue(value).ToString();
}
/// <inheritdoc />
public override object ParseValue(object value)
{
byte result;
if (byte.TryParse(value?.ToString() ?? string.Empty, out result))
{
return result;
}
return null;
}
/// <inheritdoc />
public override object ParseLiteral(IValue value)
{
if (value is StringValue)
{
return ParseValue(((StringValue)value).Value);
}
return null;
}
}
}