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

.Net环境GraphQL 2.4.0自定义remitsGeneralSearch类型无法解析报错

问题根因

该报错是GraphQL.NET 2.4.0版本的固有特性限制导致,核心原因有两点:

  • 直接使用泛型类型ConnectionGraphType<ClaimPaymentSearchGraphType>、ConnectionGraphType<CheckSearchGraphType>作为Union成员时,该版本不会自动处理泛型类型的名称生成,默认生成的类型名包含不符合GraphQL规范的特殊字符,导致类型系统无法识别对应类型。
  • 没有显式绑定Union成员GraphType与Resolver返回的CLR类型的映射关系,执行阶段解析返回结果时无法匹配到正确的GraphType,因此抛出Unexpected type错误。
解决方案

按照以下步骤修改即可修复问题:

步骤1:自定义带显式合法名称的Connection类型

不要直接使用泛型ConnectionGraphType<T>,自定义子类并指定符合GraphQL规范的唯一名称:

// 自定义理赔支付查询连接类型
public class ClaimPaymentSearchConnectionType : ConnectionGraphType<ClaimPaymentSearchGraphType>
{
    public ClaimPaymentSearchConnectionType()
    {
        // 显式指定合法的GraphQL类型名,不能包含特殊字符
        Name = "ClaimPaymentSearchConnection";
    }
}

// 自定义支票查询连接类型
public class CheckSearchConnectionType : ConnectionGraphType<CheckSearchGraphType>
{
    public CheckSearchConnectionType()
    {
        Name = "CheckSearchConnection";
    }
}

步骤2:修改UnionGraphType定义,显式绑定CLR类型映射

调整ClaimPaymentOrCheckSearchGraphType的构造逻辑,增加GraphType与CLR返回类型的绑定:

[Transient]
public class ClaimPaymentOrCheckSearchGraphType : UnionGraphType
{
    private readonly ILogger<ClaimPaymentOrCheckSearchGraphType> _logger;
    public ClaimPaymentOrCheckSearchGraphType(ILogger<ClaimPaymentOrCheckSearchGraphType> logger,
        // 注入自定义的Connection类型
        ClaimPaymentSearchConnectionType claimPaymentConnectionType,
        CheckSearchConnectionType checkConnectionType)
    {
        _logger = logger;
        // 注册Union成员并显式绑定对应的CLR返回类型
        var paymentType = Type<ClaimPaymentSearchConnectionType>();
        paymentType.CLRType = typeof(Connection<ClaimPaymentSearchRow>);
        
        var checkType = Type<CheckSearchConnectionType>();
        checkType.CLRType = typeof(Connection<CheckSearchRow>);

        ResolveType = obj =>
        {
            try
            {
                if (obj is Connection<ClaimPaymentSearchRow>)
                {
                    return claimPaymentConnectionType;
                }
                if (obj is Connection<CheckSearchRow>)
                {
                    return checkConnectionType;
                }
                throw new ArgumentOutOfRangeException($"Could not resolve graph type for {obj.GetType().Name}");
            }
            catch (Exception e)
            {
                _logger.LogInformation("ClaimPaymentOrCheckSearchGraphType Exception {e}: ", e);
                throw e;
            }
        };
    }
}

步骤3:注册自定义类型到DI容器

在你的DI配置逻辑中,新增两个自定义Connection类型的注册,生命周期和Union类型保持一致即可:

// 示例为ASP.NET Core的DI注册,根据你使用的DI容器调整即可
services.AddTransient<ClaimPaymentSearchConnectionType>();
services.AddTransient<CheckSearchConnectionType>();

原有Resolver的代码无需修改,调整完成后重启服务即可正常解析Union类型返回结果。

内容的提问来源于stack exchange,提问作者dionysus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:09:03