我有一个扩展属性需要可过滤,但是它从不同的数据源获取数据。这意味着默认过滤将不起作用,因为查询无法正确翻译。
我想创建一个虚拟过滤器类型处理程序,然后根据查询上下文手动应用过滤器。
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(使用前将#替换为@)