我正在使用 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 的名字和姓氏的字符串值为空。
我该如何解决这个问题?这是解决问题的正确方法吗?
虽然我自己不经常使用
ResolveWith
,但我很确定你必须使用 Employee
来注释 ParentAttribute
:
public string GetFullName([Parent] Employee e, [ScopedService] AppDbContext context)
{
return e.FirstName + " " + e.LastName;
}
目前的问题是,如果您的查询结果中没有 FirstName 和 LastName,但结果中只有 FullName,则返回空。原因是返回的员工对象没有名字或姓氏。解决方法:用
FirstName
装饰 LastName
和 [IsProjected(true)]
。这会将它们带到幕后进行查询,并且 FullName
如您所期望的那样出现。