如何避免HotChocolate中可空属性过滤时触发架构生成异常?
解决HotChocolate中可空类型属性自定义过滤的异常问题
我之前也遇到过这个头疼的问题!当用descriptor.BindFieldsExplicitly().Filter(x => x.EffectiveDate)给可空的DateTime?类型属性配置过滤时,确实会在架构生成阶段抛出异常,而且这个官方问题至今还没关闭。不过社区里已经有几个可行的临时解决方案,我亲测过其中几个,分享给你:
方案一:手动注册可空类型的自定义过滤输入类型
这个方法是最稳妥的,通过自定义针对DateTime?的过滤输入类型,绕开框架自动生成时的bug:
- 先创建一个继承自
FilterInputType<DateTime?>的自定义过滤类型,按需配置允许的过滤操作:
public class NullableDateTimeFilterType : FilterInputType<DateTime?> { protected override void Configure(IFilterInputTypeDescriptor<DateTime?> descriptor) { // 添加你需要的过滤操作,比如等于、大于、小于等 descriptor.Operation(DefaultFilterOperations.Equals); descriptor.Operation(DefaultFilterOperations.GreaterThan); descriptor.Operation(DefaultFilterOperations.LessThan); descriptor.Operation(DefaultFilterOperations.GreaterThanOrEquals); descriptor.Operation(DefaultFilterOperations.LessThanOrEquals); } }
- 在你的类型配置中,显式指定使用这个自定义过滤类型来绑定字段:
descriptor.BindFieldsExplicitly(); descriptor.Field(x => x.EffectiveDate) .Filter<NullableDateTimeFilterType>();
方案二:拆分绑定与过滤配置,避免链式调用
有时候框架的链式调用逻辑在处理可空类型时会出问题,拆分步骤就能避开:
descriptor.BindFieldsExplicitly(); // 先单独绑定字段 descriptor.Field(x => x.EffectiveDate); // 再单独配置该字段的过滤 descriptor.Filter(x => x.EffectiveDate);
如果需要指定具体的过滤操作,也可以这样写:
descriptor.BindFieldsExplicitly(); descriptor.Field(x => x.EffectiveDate); descriptor.Filter(x => x.EffectiveDate) .AllowEquals() .AllowGreaterThan() .AllowLessThan();
这些方案都是社区开发者总结出来的临时 workaround,因为官方的问题还处于开放状态,暂时没有官方修复版本。你可以根据自己项目的需求选择合适的方式,我自己用方案一解决了项目里的问题,稳定运行至今。
内容的提问来源于stack exchange,提问作者Dzianis Yafimau
相关产品推荐
相关产品推荐

