.NET GraphQL类型:ABCModel无法有效地强制为GraphQL类型

时间:2019-02-08 15:39:35

标签: graphql

早上好

我遇到了此错误,无法找到/了解我在Google和《星球大战》示例中看到的内容。这是我的设置。我认为您不需要查看模型,但如果可以,我可以发布。

public class IType : ObjectGraphType<IModel>
{
    public IType()
    {
        Field(x => x.iD);
        Field(x => x.fullName);
        Field(x => x.email);            
    }
}

public class PType : ObjectGraphType<PModel>
{
    public PType()
    {
        Field(x => x.PID);
        Field(x => x.PValue);
        Field<ListGraphType<SType>>("SKS");          
    }
}

public class SType : ObjectGraphType<SModel>
{
    public SType()
    {
        Field(x => x.SID);
        Field(x => x.Name);   
    }
}

现在,我创建了一个模型和一个类型,将上述所有内容组合到一个复杂的对象中。

public class IPModel
{
    public string iD {get;set;}
    public string fullName{get;set;}
    public string email{get;set;}
    public PModel PWS{get;set;}
}

public class PModel
{
    public int id {get;set;}
    public List<SModel> SKS{get;set;}=new List<SModel>();
}


public class IPType : ObjectGraphType<IPModel>
{
    public IPType()
    {
        Field(x => x.iD);
        Field(x => x.fullName);
        Field(x => x.email);
        Field<PModel>(x => x.PWS);   //Error occurs resolving this type
    }
}

我的错误出现在上面的注释行上。

  

内部异常System.ArgumentOutOfRangeException:类型:PModel无法有效地强制为GraphQL类型。

现在,我确定这不是错误,而是我所缺乏的知识/理解,因此,如果您可以发布文档/示例的链接以及关于我做错了什么的指示,我将不胜感激。

(交叉发布在这里:https://github.com/graphql-dotnet/graphql-dotnet/issues/1009#issue-408196708

1 个答案:

答案 0 :(得分:0)

  

免责声明:此方法有效,但不确定为什么以及是否是正确的解决方案。

出于某种原因,似乎无法通过lambda解析包含列表的 ANY 模型/类型。

.NET GraphQL程序集中的

Field()具有以下签名。

#region Assembly GraphQL, Version=2.4.0.0, Culture=neutral, PublicKeyToken=null
// GraphQL.dll
#endregion

public FieldType Field(Type type, string name, string description = null, QueryArguments arguments = null, Func<ResolveFieldContext<TSourceType>, object> resolve = null, string deprecationReason = null);

现在,这些参数是通过lamda表达式 EXCEPT 解析的,当涉及List / ListGraphType时,它将接缝,然后您必须显式指定参数。

  

注意PModel不是列表,但包含一个列表。

所以我将其更改为:

public class IPType : ObjectGraphType<IPModel>
{
   public IPType()
   {
     Field(x => x.iD);
     Field(x => x.fullName);
     Field(x => x.email);
     Field<PModel>("PWS"); //NOTE:replaced lamda above with string value for name
   }
}

我交叉张贴到github graphql-dotner,并在那里找到了我更喜欢的解决方案。 信用:bogdancice

  

以这种方式尝试:Field(x => x.PWS,可为空:true,类型:typeof(PType));