2008-12-12 70 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。

相關問題