1

我正在学习如何在 graphql-dotnet 中使用 CustomScalar。

我的表中有一个 tinyint 列,从我读过的内容来看,我应该在 C# 中的这个列上使用字节。经过研究,我发现我需要创建一个 ByteGraphType,但我在这样做时遇到了麻烦。

我从这个链接https://github.com/graphql-dotnet/graphql-dotnet/issues/458得到了 ByteGraphType 示例,所以我认为它会起作用。

使用此代码,我可以查询表,但是,我的突变不起作用。我没有找到一个示例来演示突变在字节列中的样子。我按照我的代码示例中的说明进行了尝试,但是在这一行中 (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,我可以变异,但不能查询。

4

1 回答 1

1

我改变了我的 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;
        }
    }
}

于 2019-04-01T19:59:47.213 回答