2008-12-12 17 views
6

我正在使用NHibernate,需要检索和处理多达200万行。理想情况下,我可以一次处理每一行 - 而不需要NHibernate一次加载200万个内存(因为,你知道这很痛)。是否有可能从使用ICriteria的NHibernate查询中获取惰性IEnumerable?

我宁愿得到一个IEnumerable,它会为每次读取迭代地调用数据读取器,以便我可以处理数据读取 - 然后丢弃它。通过这样做,我节省了大量的内存,并开始处理结果的速度更快。我还可以通过多线程和/或使用PLinq来提高性能。

这可能与NHibernate的ICriteria?它返回的所有内容似乎都是IList,并在收集参考文献之前完全加载。为什么IList而不是IEnumerable?!

我并不是说传统意义上的“懒惰”,NHibernate使用它来加载子对象或父对象。我想要一个懒惰IEnumerable从ICriteria对象获取IEnumerable的某种意义。 ICriteria只有一个List()方法,它将结果加载到ArrayList中。

+0

我以为当你在NHibernate中做了一个懒惰的IEnumerable时,你开始一次查询数据库的一行。如果你必须处理很多行,那么下载到ADO.Net的数据读取器可能会更容易。 – Min 2008-12-12 18:45:44

回答

1

ICriteria没有任何方法返回IEnumerable,但是IQuery does

0

你想要做的是包裹在一个方法你的数据访问,像这样:

public IEnumerable<YourObject> GetALotOfRows() { 
    ..execute DataReader 
    while(..read..) { 
    yield return yourObject; 
    } 
} 

不必VS或NHibernate的方便,现在,对于半伪代码非常抱歉。但关键在于使用“收益回报”。

+0

我相信NHibernate的execute语句使得它不像OP想要的那样懒惰。 – user7116 2008-12-12 14:42:36

+0

当OP说LAZY时,我认为他的意思就像SqlDataReader所做的一样。 – Strelok 2008-12-12 14:53:57

+0

这就是我想要的,但我想知道如何让NHibernate为我做,或者至少支持它。 NHibernate给我一个IList ....实际上,我使用Linq来NHibernate(来自NContrib),但这似乎并不重要.... – TheSoftwareJedi 2008-12-12 15:06:52

0

什么样的操作是你必须逐行进行的?我只是好奇 :)。

您可以尝试分页结果 - 获取前10个,下10个...等等。

编辑: 所以你必须

Session.CreateCriteria(typeof(T)).SetFirstResult(0).SetMaxResults(1).UniqueResult<T>(); 
Session.CreateCriteria(typeof(T)).SetFirstResult(1).SetMaxResults(1).UniqueResult<T>(); 
Session.CreateCriteria(typeof(T)).SetFirstResult(2).SetMaxResults(1).UniqueResult<T>(); 

你明白了,我想这是不是最好的方式,这不是IEnumerable的...但它的工作。你也可以做SetMaxResults(10)或更大的东西,所以不要一次发送1。

相关问题