如何在DbContext.Database.SqlQuery <telement>(Sp,Param)中使用CancellationTokenSource?

时间:2018-02-20 17:49:55

标签: c# entity-framework-6

如何在DbContext.Database.SqlQuery(Sp,Param)中使用CancellationTokenSource?

我正在使用EF6.2并运行带有返回类型的存储过程。

var task = Db.Database.SqlQuery<ResultType>(sp, params).ToListAsync();

foreach(var result in task.Result)
{
   var row = result;
}

我们目前的解决方案有取消令牌,但不会返回任何内容:

var task = Db.Database.ExecuteSqlCommandAsync(sp, tokenSource.Token, param);

SqlQuery只有一个方法签名,我无法在documentation

中看到有关取消的任何内容

如何使用第一种方法并包含取消令牌? 编辑:或者我应该使用另一种方法吗?

其他信息:我们当前的解决方案ExecuteSqlCommandAsync()返回一个只有“已完成”的int状态作为返回类型的任务。我正在调用的存储过程只是一个INSERT ...但我需要将它更改为SELECT,这样我们就可以生成带有结果的文件。

所以我需要一个EF方法来返回类型为“ResultType”的任务,这样我就可以通过它们来生成我们的文件。

SqlQuery&lt;&gt;()执行此操作...但无法添加取消令牌(无论如何都是这样,因此问题)

1 个答案:

答案 0 :(得分:1)

您必须将令牌传递给.ToListAsync()。只有在调用.ToListAsync(cancellationToken)时,才会实现查询并将其发送到服务器。

但请注意,传递CancellationToken的选项可能没有您希望看到的效果,请参阅this Q&A / TL; DR:查询仍将在sql server数据库级别运行完成。