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

Hotchocolate GraphQL是否会通过解析器CancellationToken参数取消EF Core查询?

HotChocolate + EF Core:用户取消请求时能否终止查询?

结论

不会自动终止查询,当前代码实现未将声明的CancellationToken传递给EF Core的查询执行流程,用户中途取消操作时,数据库查询仍会继续执行直到完成。

原因分析

  • HotChocolate会在用户取消请求时触发解析器中声明的CancellationToken,但EF Core的DbSet<T>不会自动监听该令牌。
  • 你的解析器仅返回service.Get<Product>()(即dbContext.Set<Product>()),未将CancellationToken关联到查询执行环节,EF Core无法感知取消信号。

修正方案

要让EF Core响应取消请求,需显式将CancellationToken传递给查询:

方案1:解析器中异步执行并传递令牌

修改解析器,将IQueryable转为异步执行逻辑,传入令牌:

public async Task<IEnumerable<Product>> GetProducts([Service] IService service, CancellationToken cancellationToken) 
    => await service.Get<Product>().ToListAsync(cancellationToken);

方案2:Service层关联令牌

修改IService的Get方法,支持接收CancellationToken并通过WithCancellation绑定到查询:

// IService接口定义
IQueryable<T> Get<T>(CancellationToken cancellationToken);

// Service实现
public IQueryable<T> Get<T>(CancellationToken cancellationToken) 
    => dbContext.Set<T>().WithCancellation(cancellationToken);

解析器调用时传入令牌:

public IQueryable<Product> GetProducts([Service] IService service, CancellationToken cancellationToken) 
    => service.Get<Product>(cancellationToken);

补充说明

通过WithCancellation或异步执行方法传递令牌后,EF Core会实时监听令牌状态。用户取消请求时,令牌触发,EF Core会立即终止正在执行的数据库查询,避免资源浪费。

内容的提问来源于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.16 11:09:55