如何设置EF(6)Command Timeout,与streamed Query交互

How does setting EF (6) Command Timeout, interact with a streamed Query

我有一个应用程序,在正常的 CRUD 操作中包含一些繁重的查询。

我只是在解决一个问题,即一堆代码调用正在更改上下文的超时而不是重置它。在我 运行 我的长查询之后,我一般想留下正常的低超时时间。

对于大多数大型查询,管理超时非常简单,因为我将整个数据集拉入内存。所以我得到:

简单!吱吱.

但在一种情况下,数据集太大而无法一次性保存在内存中,因此我积极利用 EF 提供流的事实 - 懒惰地迭代初始 IQueryable,将其作为 IEnumerable 传递,处理每个元素依次使用 Linq 调用或 yield return 语句。

以前这很好,因为我设置了很长的超时,然后再也没有减少它(而且超时很大,所以它涵盖了查询的执行和所有处理)。但是现在我想重置它。

如果我天真地这样做,代码执行将如下所示:

即重置超时后查询仍在执行。

我找不到任何关于 CommandTimeouts 如何与流式查询交互的文档。


有人知道这是怎么回事吗?

上面的元代码能否正常工作?

每个查询的命令超时是在查询启动时固定的,还是以其他方式完成的?


就此而言,我不太了解流式查询的实现细节。 SQL 服务器知道要流式传输查询吗?

从客户端提交查询到获取最后一行,查询在 SQL 服务器上 运行。结果可能已被假脱机到内存或 TempDb,或者查询计划可能在客户端获取行时处于活动状态 运行。

SqlCommand.CommandTimeout 是一个 client-side 超时,用于测量(在查询结果为 returns 的情况下)客户端等待对 SqlCommand.ExecuteReader 的响应的时间(), SqlDataReader.Read() 和 SqlDataReader.NextResult().

Is the command timeout fixed per query at the point at which the query is initiated, or done in some other way?

它是在 SqlCommand 上设置的,当您更改 EF 中的超时时,它应该不会影响 运行 查询。