GraphQL.NET, как добавить перечисление в тип GraphQL - PullRequest
0 голосов
/ 01 марта 2019

У меня есть простое перечисление, которое я пытаюсь включить в свой тип GraphQL, и получаю следующую ошибку:

Тип GraphQL для поля: «Категория» в родительском типе: «NewsItemType» можетне может быть получено неявно.

------------------ Тип GraphQL для поля: «Категория» для родительского типа: «NewsItemType» не может быть получен неявно.

--------------- Тип: NewsType не может быть эффективно приведен к типу GraphQL Имя параметра: тип

мой простой enum выглядитнапример:

public enum NewsType
{
    General = 0,

    Business = 1,

    Entertainment = 2,

    Sports = 3,

    Technology = 4
}

GraphQL ObjectGraphType, в который он включен:

public class NewsItemType : ObjectGraphType<NewsItemViewModel>
{
    public NewsItemType()
    {
        Field(x => x.Id).Description("Id of a news item.");
        Field(x => x.Title).Description("Title of a new item.");
        Field(x => x.Description).Description("Description of a news item.");
        Field(x => x.Author).Description("Author of a news item.");
        Field(x => x.Url).Description("URI location of the news item");
        Field(x => x.ImageUrl).Description("URI location of the image for the news item");
        Field(x => x.PublishDate).Description("Date the news item was published");
        Field(x => x.Category).Description("Category of the news item.");
    }
}

и, наконец, viewmodel, на котором основывается тип graphql:

public class NewsItemViewModel : ViewModelBase
{
    public string Title { get; set; }

    public string Author { get; set; }

    public string Description { get; set; }

    public string Url { get; set; }

    public string ImageUrl { get; set; }

    public DateTime PublishDate { get; set; }

    public NewsType Category { get; set; }
}

Что я делаю здесь неправильно и как я могу это преодолеть?

РЕДАКТИРОВАТЬ: мой запрос содержит следующее:

        Field<ListGraphType<NewsItemType>>(
            name: "newsItems",
            arguments: new QueryArguments(
                new QueryArgument<IntGraphType>() { Name = "count" },
                new QueryArgument<IntGraphType>() { Name = "category" }),
            resolve: context =>
            {
                var count = context.GetArgument<int?>("count");
                var category = context.GetArgument<int>("category");
                var newsType = (NewsType)category;

                if (count.HasValue)
                {
                    return newsItemService.GetMostRecent(newsType, count.Value);
                }
                else
                {
                    return newsItemService.GetMostRecent(newsType);
                }
            }
        )

1 Ответ

0 голосов
/ 26 июля 2019

Вот быстрый способ сделать это для вашего случая.Обычно вы не используете лямбда-выражение по умолчанию Field.Вместо этого на самом деле выписать распознаватель самостоятельно и преобразовать перечисление в правильный тип.Это помогает GraphQL правильно преобразовать тип в тип, который вы хотите вернуть.

Field<IntGraphType>("category", resolve: context => (int)context.Source.Category);

Если ваше перечисление было строкой, вы могли бы сделать то же самое и для этого.

Field<StringGraphType>("category", resolve: context => context.Source.Category.ToString());

В этом ответе есть и другой, более подробный способ, в котором вы сначала наследуете от EnumerationGraphType<T>, а затем делаете тот же пользовательский преобразователь, что и выше.

https://stackoverflow.com/a/56051133/11842628

...