我在一個C#項目中的SQLite數據庫上使用NHibernate。我有一個看起來像這樣的通用批量數據處理方法:NHibernate與linq分頁性能
private void DataProcess<Tobj>(int pageSize, Expression<Func<Tobj, bool>> whereClause,
Action<Tobj, ISession> dataProcessingCallback) where Tobj : IModelBase
{
int offset = 0;
bool moreToGet = true;
while (moreToGet)
{
DataAccess((ISession session) =>
{
IEnumerable<Tobj> result = session.Query<Tobj>().Where(whereClause);
List<Tobj> data = result.Skip(offset)
.Take(pageSize)
.ToList();
foreach (Tobj item in data) { dataProcessingCallback(item, session); }
if (data.Count == pageSize) { offset += pageSize; }
else { moreToGet = false; }
});
}
}
(在DataAccess方法爲我們提供了我們的會話對象一起工作,處理事務等)
說完看了看四周,這似乎非常類似於大多數其他linq分頁實現。他們通常做一個.Skip()。拿()
我的問題是,對於大型數據集(在測試中,我看着有大約200k行)需要AGES(調試器中大約20秒)執行結果.skip(offset).Take(pageSize).ToList();線。 這是與pageSize = 100和偏移量= 0.
我的理解是,由於推遲執行,SELECT不會發生,直到它需要(在這種情況下.ToList())。此時,它知道它需要哪些行只應選擇相關的100行。
'data'有預期的100行,但好像系統已經從DB獲取了所有200k奇數行,然後在代碼中完成了分頁。
我對LINQ/NHibernate的理解是否正確? 如果是這樣,我想我需要做這樣的事情與標準API:NHibernate Paging performance (Better option)
Ahhhhhh!謝謝!這很有道理。我做了改變,現在一切都運行完美。 :) – Steve