使用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
相关产品推荐
相关产品推荐

