C# DataReader-返回可枚举/可查询的数据是否比返回列表更有效?

C# DataReader-返回可枚举/可查询的数据是否比返回列表更有效?,c#,.net,C#,.net,如果数据读取器在接收数据时释放数据,则使用可枚举项应允许数据立即从数据访问函数发送回调用方 如果我使用基于列表的方法,那么调用者将等待接收所有数据,因为必须“枚举”整个读卡器才能转换为列表 这种理解正确吗?因此,在使用数据读取器编写数据访问代码时,避免使用列表返回集合通常会更快吗 我的意思是,可能在数据访问函数中使用REDUCT返回,而不是初始化对象列表并将对象添加到一个列表中,然后返回该列表。这是正确的。不仅因为延迟计算,它是即时的,而且它还防止了不必要的内存分配,因为您一次只处理一行 大量的

如果数据读取器在接收数据时释放数据,则使用可枚举项应允许数据立即从数据访问函数发送回调用方

如果我使用基于列表的方法,那么调用者将等待接收所有数据,因为必须“枚举”整个读卡器才能转换为列表

这种理解正确吗?因此,在使用数据读取器编写数据访问代码时,避免使用列表返回集合通常会更快吗


我的意思是,可能在数据访问函数中使用REDUCT返回,而不是初始化对象列表并将对象添加到一个列表中,然后返回该列表。

这是正确的。不仅因为延迟计算,它是即时的,而且它还防止了不必要的内存分配,因为您一次只处理一行


大量的数据最好留在数据库中。

这是你谈论的两个不同概念;一个需要在连接模式下工作(流方法,它将尽快返回结果),而另一个将获得结果并释放连接。我认为“更快”在这里不是一个准确的术语。如果您有N条记录,它们将无法更快地到达客户端,特别是在需要任何传统计算的情况下。客户机可能会更快地看到一些结果,但可能不会看到整个列表(这在每个特定情况下都很容易衡量),并且您必须从代码中支付额外的性能,以保持调用方与结果同步(类似于并发集合)。

例如,在web环境中,这是可以做到的,但代码编写/管理和同步的成本非常高,我认为,在大多数情况下,这不值得付出努力。

取决于您所说的更快

我将其视为批处理与端到端

e、 g.如果要在读卡器中显示为该行创建的实例。然后返回IEnumerable将给您一个机会,这样做不会出现等待您正在枚举的所有实例被创建的不幸结巴

另一个问题是你返回的东西的生命周期。如果它一经处理就超出了范围,那么IEnumerable就是一条出路,因为列表意味着为所有这些对象分配内存,其中IEnumerable一次只允许一个

另一个问题是,处理其中一个列举的项目需要多长时间,我从来没有觉得让读者在相当长的时间内保持开放是个好主意,我一直非常相信小而快的客户机与数据库的交互


所以我的说法通常是正确的。

如果他迭代所有结果,他会在最初的某个地方创建一个列表。我很难看出它将如何减少内存的浪费。@YavgenyP。如果返回的项目一经处理就被装箱,这是一个需要考虑的问题。@YavgenyP:不需要在任何地方创建列表。如果您的DAL方法使用
DataReader.Read()
,一次内部推进一行,您的
产生返回结果,那么您的客户端一次只接收一个项目。如果你在关系数据库上做某种映射/约简,你可能会想这样做。是的,这是有意义的,除非他希望最终使用整个集合。