如果数据读取器在接收到数据时释放数据,那么使用枚举应该允许该数据立即从数据访问函数发送回调用者。
如果我使用基于列表的方法,那么调用者将等待接收所有数据,因为必须“枚举”整个阅读器才能转换为列表。
这种理解是否正确,因此在使用数据读取器编写数据访问代码时避免使用列表返回集合通常更快吗?
我的意思是可能在使用读取器的数据访问函数中使用 yield return 与初始化对象列表并将对象添加到然后返回的列表中。
这是正确的。由于延迟评估,它不仅是即时的,而且还可以防止不必要的内存分配,因为您一次只处理一行。
大量数据最好留在数据库中。
取决于你的意思是更快
我将其视为批量与端到端。
例如,如果您想在阅读器中显示为该行创建的实例。然后返回 IEnumerable 会给你一个机会,并且没有不幸的口吃等待你枚举的所有实例来创建。
另一个问题是您返回的任何东西的生命周期。如果它一经处理就会超出范围,那么 IEnumerable 就是要走的路,因为 List 意味着为所有这些分配内存,而 IEnumerable 一次就足够了。
另一个问题是处理一个列举的项目需要多长时间,从来没有让我觉得让读者在相当长的时间内保持开放是个好主意,我一直坚信客户的小而快与数据库的交互。
所以总的来说,我所说的方式是正确的。
这是您在谈论的两个不同的概念;一种需要在连接模式下工作(流式方法,它将尽快返回结果),而另一种将获取结果并释放连接。我不认为更快是一个准确的术语。如果您有 N 条记录,它们不会更快地到达客户端,尤其是在需要任何额外计算的情况下。客户端可能会更快地看到一些结果,但可能不会看到整个列表(这可以在每个特定情况下轻松衡量),并且您必须从代码中支付额外的性能,以保持调用者同步结果(类似于并发集合)。
例如,在 Web 环境中,这是可以做到的,但是代码编写/管理和同步的成本非常高,我认为在大多数情况下不值得付出努力。