在正常的 CRUD 操作中,我有一个带有少量繁重查询的应用程序。
我只是在解决一个问题,即一堆代码调用正在更改上下文的超时而不是重置它。在我运行我的长查询之后,我一般想留下正常的低超时。
对于大多数大型查询,管理超时非常简单,因为我将整个数据集拉入内存。所以我得到:
- 设置长超时
- 运行查询
- 完成查询
- 将内存中的数据具体化
- 将超时设置回它的旧默认值。
简单!吱。
但在一种情况下,数据集太大而无法一次性保存在内存中,因此我积极利用 EF 提供流式传输的事实 - 懒惰地迭代初始 IQueryable,将其作为 IEnumerable 传递,依次处理每个元素,使用 Linq 调用或yield return
语句。
以前这很好,因为我设置了长超时,然后从不减少它(超时很大,所以它涵盖了查询的执行和所有处理)。但现在我想重置它。
如果我天真地这样做,代码执行将如下所示:
- 设置长超时
- 启动流式查询
- 将超时设置回它的旧默认值。
- 读取并使用返回的第一条记录。
- 读取并使用返回的最后一条记录。
- 流式查询已完成。
即超时重置后查询仍在执行。
我找不到任何关于 CommandTimeouts 如何与流式查询交互的文档。
有谁知道这是如何工作的?
上述元代码能否正常工作?
每个查询的命令超时是在查询启动时固定的,还是以其他方式完成的?
就此而言,我并不真正了解流式查询的实现细节。SQL Server 是否知道要对查询进行流式处理,还是什么?