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

如何在.NET Hot Chocolate GraphQL中结合[UseProjection]实现自定义游标分页

解决方案

要在HotChocolate中结合[UseProjection]实现基于游标的分页(而非默认的OFFSET偏移量分页),需要从以下几个关键环节调整:

1. 切换游标分页模式并启用排序支持

默认的[UsePaging]使用OffsetPagingProvider,会生成OFFSET...FETCH格式的SQL。要启用游标分页,需显式指定CursorPagingProvider,同时必须为查询添加排序能力(游标分页依赖有序数据集)。

修改你的Query类代码:

using HotChocolate.Data;

namespace Efct2.GraphQL.Query
{
    [ExtendObjectType(typeof(Query))]
    public class StyleQuery
    {
        // 指定游标分页提供者,保留投影与排序功能
        [UsePaging(Provider = CursorPagingProvider.DefaultName)]
        [UseProjection]
        [UseSorting]
        public async Task<IQueryable<Style>> Styles([Service] IStyleService styleService)
        {
            return await styleService.GetAsync();
        }
    }
}

2. 确保查询根IQueryable包含稳定排序

游标分页无法基于无序数据集工作,因此必须在业务层返回的IQueryable中指定默认的稳定排序(比如基于主键或唯一索引字段)。修改你的IStyleService实现:

public async Task<IQueryable<Style>> GetAsync()
{
    // 假设Style实体有唯一主键StyleId,以此作为排序基准
    return _dbContext.Styles.OrderBy(s => s.StyleId);
}

3. 验证生成的SQL

调整后,后端SQL Server会生成基于游标条件的查询,而非OFFSET格式。示例SQL如下:

exec sp_executesql N'SELECT [s].[Company_Code] AS [CompanyCode], [s].[Division_Code] AS [DivisionCode], [s].[Item_Number] AS [ItemNumber], [s].[Color_Code] AS [ColorCode], [s].[Description], [s].[Category_Code] AS [CategoryCode], [s].[Class_Code] AS [ClassCode]
FROM [Style] AS [s]
WHERE [s].[StyleId] > @__cursor_0
ORDER BY [s].[StyleId]
FETCH NEXT @__p_0 ROWS ONLY',
    N'@__cursor_0 int,@__p_0 int',@__cursor_0=9,@__p_0=10

关键说明

  • 原查询用OFFSET的原因:你的初始代码没有指定稳定排序,HotChocolate只能生成ORDER BY (SELECT 1)这种无序排序,此时无法构建游标分页的WHERE条件,只能退化为偏移量分页。
  • 游标分页依赖唯一有序字段:如果使用非唯一字段排序,可能出现数据重复或遗漏,建议优先使用主键(如StyleId)。
  • [UseSorting]的作用:允许客户端自定义排序字段,若需强制固定排序,直接在IQueryable中提前执行OrderBy即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:15:40