使用 Hot Chocolate 和 EFCore 的 GraphQL 的“派生”字段解析器

问题描述 投票:0回答:2

我正在使用 ASP.NET 5、Hot Chocolate 和 EFCore 5 开发 GraphQL 端点。我有使用 Hot Chocolate 在 GraphQL 中公开的实体框架实体。我需要“派生”其中一个字段。举例来说,我有一个名为“employee”的类,它具有 FirstName 和 LastName 属性。我希望 GraphQL 端点为员工公开一个“FullName”字段,该字段将在内部连接名字和姓氏。请注意,FirstName 和 LastName 值作为 Employee 数据库表的列存在,但将派生出“FullName”字段。我该怎么做呢?我尝试了如下,但它不起作用

public class EmployeeType : ObjectType<Employee>
{
    protected override void Configure(IObjectTypeDescriptor<Employee> descriptor)
    {
        descriptor.Field(@"FullName")
            .Type<StringType>()
            .ResolveWith<Resolvers>( p => p.GetFullName(default!, default!) )
            .UseDbContext<AppDbContext>()
            .Description(@"Full name of the employee");
    }

    private class Resolvers
    {
        public string GetFullName(Employee e, [ScopedService] AppDbContext context)
        {
            return e.FirstName + " " + e.LastName;
        }
    }
}

FullName 字段确实显示在 GraphQL 查询中,但始终为空。我认为传递给 GetFullName() 的 Employee 实例 e 的名字和姓氏的字符串值为空。

我该如何解决这个问题?这是解决问题的正确方法吗?

c# graphql hotchocolate
2个回答
2
投票

虽然我自己不经常使用

ResolveWith
,但我很确定你必须使用
Employee
来注释
ParentAttribute

public string GetFullName([Parent] Employee e, [ScopedService] AppDbContext context)
{
    return e.FirstName + " " + e.LastName;
}

在解析器文档中了解更多相关信息


0
投票

目前的问题是,如果您的查询结果中没有 FirstName 和 LastName,但结果中只有 FullName,则返回空。原因是返回的员工对象没有名字或姓氏。解决方法:用

FirstName
装饰
LastName
[IsProjected(true)]
。这会将它们带到幕后进行查询,并且
FullName
如您所期望的那样出现。

© www.soinside.com 2019 - 2024. All rights reserved.