【发布时间】:2008-12-12 14:29:45
【问题描述】:
我正在使用 NHibernate,需要检索和处理多达 200 万行。理想情况下,我可以处理每一行——一次一个——而不用 NHibernate 一次加载所有 200 万个内存(因为,你知道,这很痛苦)。
我希望获得一个 IEnumerable,它会为每次读取迭代地调用数据读取器,以便我可以处理读取的数据 - 然后丢弃它。通过这样做,我节省了大量内存,并开始更快地处理结果。我还可以通过多线程和/或使用 PLinq 来提高性能。
NHibernate 的 ICriteria 可以做到这一点吗?它返回的所有内容似乎都是 IList,并且在关闭集合引用之前已完全加载。为什么是 IList 而不是 IEnumerable?!
我并不是指 NHibernate 在加载子对象或父对象时使用的传统意义上的“懒惰”。我想要一个 惰性 IEnumerable,意味着以某种方式从 ICriteria 对象获取 IEnumerable。 ICriteria 只有一个 List() 方法,可以将结果加载到 ArrayList 中。
【问题讨论】:
-
我认为当您在 NHibernate 中执行惰性 IEnumerable 时,您开始一次查询数据库一行。如果您必须处理这么多行,那么下拉到 ADO.Net 的数据读取器可能会更容易。
标签: .net nhibernate .net-3.5