如何为 hotchocolate 12 graphql 中的扩展字段设置虚拟过滤器处理程序?

2024-04-09

我有一个扩展属性需要可过滤,但是它从不同的数据源获取数据。这意味着默认过滤将不起作用,因为查询无法正确翻译。

我想创建一个虚拟过滤器类型处理程序,然后根据查询上下文手动应用过滤器。

public class User
{
    public string? UserName { get; set; }
}

public class ProjectDetailListing
{
    public bool? isPublic { get; set; }
}

[ExtendObjectType(typeof(User))]
public class UserExtensions
{

    public async Task<ProjectDetailListing?> Listing(
        [Parent] User parentObject,
        ProjectListingDataLoader dataLoader,
        CancellationToken cancellationToken
        )
    {
        //fetch data from a different db
    }
}

public class CustomFilteringConvention : FilterConvention
{
    protected override void Configure(IFilterConventionDescriptor descriptor)
    {
        descriptor.AddDefaults();
        descriptor
           .BindRuntimeType<User, UserFilterInput>();
    }
}
 
public class UserFilterInput : FilterInputType<User>
{
    protected override void Configure(
        IFilterInputTypeDescriptor<User> descriptor)
    {
        descriptor.Field("listing").Type<FilterInputType<ProjectDetailListing>>().Description("project listing");
    }
}

现在我收到以下错误。

HotChocolate.SchemaException: For more details look at the `Errors` property.

1. For the field listing of type UserFilterInput was no handler found.

   at HotChocolate.Data.Filters.FilterTypeInterceptor.OnBeforeCompleteType(ITypeCompletionContext completionContext, DefinitionBase definition, IDictionary`2 contextData)
   at HotChocolate.Configuration.AggregateTypeInterceptor.OnBeforeCompleteType(ITypeCompletionContext completionContext, DefinitionBase definition, IDictionary`2 contextData)
   at HotChocolate.Types.TypeSystemObjectBase`1.CompleteType(ITypeCompletionContext context)

最后,我创建了自定义过滤器来覆盖默认行为

    public class UserFilterInput : FilterInputType<User>
    {
       protected override void Configure(
         IFilterInputTypeDescriptor<User> descriptor)
            protected override void Configure(
                IFilterInputTypeDescriptor<SearchProjectsResponseResult> descriptor)
            {
                    descriptor.Field("listing")
                    .Type<FilterInputType<ProjectDetailListing>>()
                    .Description("project listing");
                    .Extend()
                    .OnBeforeCreate(_ => _.Handler = new DummyHandler());
            }
        }
    
    
        public class DummyHandler : QueryableDefaultFieldHandler
        {
            public override bool TryHandleEnter(
                QueryableFilterContext context,
                IFilterField field,
                ObjectFieldNode node,
                [NotNullWhen(true)] out ISyntaxVisitorAction? action)
            {
                Expression<Func<SearchProjectsResponseResult, bool>> expression =
                     _ => true;
                var invoke = Expression.Invoke(expression, context.GetInstance());
                context.GetLevel().Enqueue(invoke);
                action = SyntaxVisitor.SkipAndLeave;
                return true;
            }
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 hotchocolate 12 graphql 中的扩展字段设置虚拟过滤器处理程序? 的相关文章

随机推荐