Hotchocolate 13.x如何强制包含未被客户端选择的属性
解决HotChocolate 13.x强制包含未请求属性的问题
针对你遇到的场景,这里提供两种无需修改实体项目(无需引入HotChocolate特性)的解决方案:
方案1:全局投影约定强制包含字段
通过自定义投影约定,让指定实体的目标属性在所有GraphQL查询中都被自动包含,不管客户端是否请求该字段。
- 创建自定义投影约定类
using HotChocolate.Data.Projections; using YourProject.Entities; // 仅引用实体所在项目,无需引入GraphQL相关包 public class ForceIncludeFieldProjectionConvention : ProjectionConvention { protected override void Configure(IProjectionConventionDescriptor descriptor) { // 针对目标实体,强制包含需要的属性 descriptor.ForEntity<YourEntity>() .Include(e => e.RequiredProperty); } }
- 在GraphQL服务注册时替换默认约定
services.AddGraphQLServer() .AddQueryType() .AddTypeExtension<YourEntityExtension>() // 你的实体扩展类型 .AddConvention<IProjectionConvention, ForceIncludeFieldProjectionConvention>();
方案2:针对单个计算字段配置强制投影
如果只需要在特定计算字段解析时包含依赖属性,可以在ExtendObjectType的字段配置中指定投影规则,更精准控制性能。
using HotChocolate; using HotChocolate.Data.Projections; using YourProject.Entities; public class YourEntityExtension : ObjectTypeExtension<YourEntity> { protected override void Configure(IObjectTypeDescriptor<YourEntity> descriptor) { descriptor.Field("calculatedField") .Type<StringType>() .Resolve(context => { var entity = context.Parent<YourEntity>(); // 使用RequiredProperty计算结果 return $"基于{entity.RequiredProperty}生成的计算值"; }) // 配置投影,强制包含依赖的RequiredProperty .ConfigureProjection(projection => projection.Include(e => e.RequiredProperty)); } }
注意事项
- 两种方案都无需在实体类上添加任何HotChocolate特性,完全符合实体项目不引用GraphQL的要求。
- 方案1全局生效,适合该实体所有查询都需要该属性的场景;方案2仅针对单个计算字段,性能更优。
内容的提问来源于stack exchange,提问作者Michel Fornaris
相关产品推荐
相关产品推荐

