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

使用Hot Chocolate分页时遇'resolver非可迭代类型'错误求助

解决Hot Chocolate分页与包装类响应的冲突问题

给你几个可行的解决思路:

1. 让Resolver直接返回可迭代集合,单独处理错误

[UsePaging]特性要求Resolver返回IEnumerable/IQueryable/IAsyncEnumerable这类可迭代类型,而非包含集合的包装类。你可以在Resolver里先取出ServiceResponse里的列表,直接返回给分页处理器,同时把包装类里的Error转成GraphQL标准错误抛出:

[UsePaging]
public async IAsyncEnumerable<MyDto> GetMyDatas([Service] IMyService service)
{
    var response = await service.GetMyDatasAsync();
    
    // 处理错误:把包装类里的错误转成GraphQL错误
    if (response.Errors?.Any() == true)
    {
        foreach (var err in response.Errors)
        {
            throw new GraphQLException(new Error(err.Message));
        }
    }
    
    // 返回可迭代的集合给分页处理器
    return response.Data.AsAsyncEnumerable();
}

2. 手动实现分页,保留包装类结构

如果业务上必须保留ServiceResponse的返回格式,那就不用[UsePaging],自己处理分页参数(skip、take),在Resolver里对列表做分页处理:

public async Task<ServiceResponse<List<MyDto>>> GetMyDatas(int skip, int take, [Service] IMyService service)
{
    var response = await service.GetMyDatasAsync();
    
    if (response.Data != null)
    {
        // 手动执行分页逻辑
        response.Data = response.Data.Skip(skip).Take(take).ToList();
    }
    
    return response;
}

3. 自定义分页处理器适配包装类(进阶)

如果需要全局支持包装类的分页,可以自定义Hot Chocolate的分页处理器。继承DefaultPagingHandler,重写ResolveAsync方法,从ServiceResponse里提取出集合进行分页,同时保留错误信息。这种方式适合多接口都有类似需求的场景,不过实现起来稍复杂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:45:08