2010-08-28 158 views
1

在我的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:當然,我在映射文件中使用懶加載...

預先感謝您!

+0

重要提示: 與此同時,我發現樣本linq-expression生成非常難看的SQL代碼,實際上使用外部左連接來比較「User」屬性。但是,升級到NH3和嵌入式linq提供程序可以解決此問題並輸出更多優化的代碼! 所以,如果你考慮使用Linq2NHibernate - 去NH3! – 2010-08-29 00:40:16

回答

0

集合上的LINQ將始終是LINQ到對象,因爲它們不會實現IQueryable,因此您將在內存中加載所有內容。

查詢是目前唯一可行的方法。

+0

NH3 linq提供者的情況仍然如此嗎? – DanP 2010-08-29 11:40:30

+0

是的,提供者位於查詢引擎之上;收集管理沒有改變。您可以對實體集合執行LINQ查詢,但不能直接對檢索到的對象執行查詢。 – 2010-08-29 13:01:09

+0

感謝您的確認..這有點令人失望,因爲這會讓linq的使用更加連貫。我猜測這會導致收藏中的骯髒跟蹤等問題。對? – DanP 2010-08-30 12:37:42