使用GraphQL for .NET,我想用一个新集合替换Foo的集合。

鉴于此服务器端代码:

public class Foo
{
    public Foo(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
}

public class Root
{
    public Foo[] Foos { get; private set; }

    public Foo[] UpdateFoos(Foo[] foos)
    {
        Foos = foos;
        return Foos;
    }
}

public class MutationSchema : Schema
{
    public MutationSchema()
    {
        Query = new MutationQuery();
        Mutation = new MutationChange();
    }
}

public class FooType : ObjectGraphType
{
    public FooType()
    {
        Name = "IndividualFoo";
        Field<StringGraphType>("name");
    }
}

public class FoosType : ObjectGraphType<ListGraphType<FooType>>
{
    public FoosType()
    {
        Name = "ListOfFoo";
        Field<ListGraphType<FooType>>("foos");
    }
}

public class FoosInput : InputObjectGraphType
{
    public FoosInput()
    {
        Name = "InputForManyFoo";
        Field<ListGraphType<FooInput>>("foos");
        Field<ListGraphType<FooType>>("foosResult");
    }
}

public class FooInput : InputObjectGraphType
{
    public FooInput()
    {
        Name = "InputForSingleFoo";
        Field<StringGraphType>("name");
    }
}

public class MutationQuery : ObjectGraphType
{
    public MutationQuery()
    {
        Name = "Query";
        Field<FoosType>("queryAllFoos");
    }
}

public class MutationChange : ObjectGraphType
{
    public MutationChange()
    {
        Name = "Mutation";

        Field<FoosInput>(
            "updateAllFoos",
            arguments: new QueryArguments(
                new QueryArgument<FoosInput>
                {
                    Name = "updateFoosQueryArgument"
                }
            ),
            resolve: context =>
            {
                var root = context.Source as Root;
                var change = context.GetArgument<Foo[]>("updateFoosQueryArgument");
                // TODO: update collection e.g. return root.UpdateFoos(change);
                return change;
            }
        );
    }
}

当我运行突变查询时:
mutation M {
    fooCollection: updateAllFoos(updateFoosQueryArgument: {
        foos: [
            {name: "First Foo"},
            {name: "Second Foo"}
        ]}) {
        foosResult
    }
}

然后我得到以下错误:
{GraphQL.Validation.ValidationError: Cannot query field "foosResult" on type "InputForManyFoo". Did you mean "foosResult"?}

在撰写本文时,我正在使用latest version of GraphQL for .NET

我想念什么?

工作示例: How to mutate a list of custom objects in GraphQL for .NET

最佳答案

我从 git 的答案。

为结果输入一个ObjectGraphType。请注意,从resolve返回的对象的“形状”与图形类型的“形状”匹配。

public class FoosResultType : ObjectGraphType
{
    public FoosResultType()
    {
        Field<ListGraphType<FooType>>("foosResult");
    }
}

public class FoosResult
{
    public IEnumerable<Foo> FoosResult { get;set; }
}

public class MutationChange : ObjectGraphType
{
    public MutationChange()
    {
        Name = "Mutation";

        Field<FoosResultType>(
            "updateAllFoos",
            arguments: new QueryArguments(
                new QueryArgument<ListGraphType<FooInput>>
                {
                    Name = "updateFoosQueryArgument"
                }
            ),
            resolve: context =>
            {
                var root = context.Source as Root;
                var change = context.GetArgument<List<Foo>>("updateFoosQueryArgument");
                // TODO: update collection e.g. return root.UpdateFoos(change);
                return new FoosResult { FoosResult = change };
            }
        );
    }
}

并更新了突变:
mutation M {
    fooCollection: updateAllFoos(updateFoosQueryArgument: [
          {name: "First Foo"},
          {name: "Second Foo"}
        ]) {
        foosResult {
          name
        }
    }
}

关于c# - 如何在GraphQL for .NET中更改自定义对象的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41051523/

10-16 21:22