You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hotchocolate 13.x如何强制包含未被客户端选择的属性

解决HotChocolate 13.x强制包含未请求属性的问题

针对你遇到的场景,这里提供两种无需修改实体项目(无需引入HotChocolate特性)的解决方案:

方案1:全局投影约定强制包含字段

通过自定义投影约定,让指定实体的目标属性在所有GraphQL查询中都被自动包含,不管客户端是否请求该字段。

  1. 创建自定义投影约定类
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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 06:32:41