Тип .NET GraphQL: ABCModel не может быть эффективно приведен к типу GraphQL - PullRequest
0 голосов
/ 08 февраля 2019

Доброе утро,

Я сталкиваюсь с этой ошибкой и не могу найти / понять то, что я вижу в 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 голосов
/ 11 февраля 2019

Отказ от ответственности: это работает, но не уверен, почему и если это правильное решение.

По некоторым причинам кажется, что ЛЮБАЯ модель / тип, который содержитсписок не может быть разрешен с помощью лямбды.

Поле () из сборки .NET GraphQL имеет следующую подпись.

#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 и получил там это решение, которое мне нравится больше.Credit: bogdancice

Попробуйте сделать это следующим образом: Поле (x => x.PWS, nullable: true, тип: typeof (PType));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...