在我的ASP.NET Web應用程序中,我使用NHibernate來堅持我的「用戶」-Instances,其中每個人都有一個「條目」 - 集合。這是一個典型的一對多映射,它工作得很好。針對這些項目的映射代碼如下所示:NHibernate查詢映射集合
<bag name="Entries" cascade="all-delete-orphan">
<key column="UserID" />
<one-to-many class="MyApp.Entities.Entry, MyApp.Entities" />
</bag>
現在我有一個頁面,在這裏我想與登錄用戶的所有條目顯示網格。爲此,我可以簡單地將當前用戶的「Entries」屬性綁定到網格「DataSource」 - 屬性。這也可以正常工作,但這也意味着內置分頁功能(Telerik RadGrid)的網格對數據庫性能沒有任何影響,因爲每次顯示網格時都會加載所有條目。
因此,我可以應用我的自定義分頁,其中我只獲取需要顯示網格當前頁面的行。一個典型的Linq2NHibernate查詢看起來是這樣的:
var query = from entry in Session.Linq<Entry>()
where entry.User == currentUser
select entry;
query.Skip(pageNum * pageSize).Take(pageSize).ToList();
使用這種方法,我需要altough NHibernate的已經做了用戶和條目之間的映射致以庫...
我的問題是:如果我使用LINQ直接查詢我的「用戶」對象的「條目」集合 - 這是否意味着所有條目將從數據庫加載,然後在內存中過濾,或者將其轉換爲真正的「數據庫」 - 查詢,這樣我可以使用這種更舒適的方法來實現分頁?
例子:
myGrid.DataSource = currentUser.Entries.Skip(pageNum * pageSize).Take(pageSize).ToList();
J4I:當然,我在映射文件中使用懶加載...
預先感謝您!
重要提示: 與此同時,我發現樣本linq-expression生成非常難看的SQL代碼,實際上使用外部左連接來比較「User」屬性。但是,升級到NH3和嵌入式linq提供程序可以解決此問題並輸出更多優化的代碼! 所以,如果你考慮使用Linq2NHibernate - 去NH3! – 2010-08-29 00:40:16