2011-02-16 66 views
4

在我的NHibernate映射中,我有兩個對象 - Listing和User。一個用戶可以有多個列表,以及(流利)映射設置爲這樣:Nhibernate QueryOver - 爲什麼我必須指定JoinQueryOver

上市:

References<User>(h => h.User).ForeignKey("fk_UserID").Not.LazyLoad().Fetch.Join().Cascade.SaveUpdate(); 

用戶:

HasMany<Listing>(u => u.Listings); 

這工作得很好。但是,當我開始使用QueryOver時,我嘗試過:

DbSession.QueryOver<HaveListing>() 
    .Where(h => h.IsModerated == false) 
    .And(h => h.User.SpammedStatus == false) 

其中失敗。然而,這作品:

DbSession.QueryOver<HaveListing>() 
    .Where(h => h.IsModerated == false) 
    .JoinQueryOver(h => h.User) 
     .Where(u => u.SpammedStatus == false) 

顯然,使用後者是好的,但我想確保我絕不錯過something-我的關係在映射定義,所以我真的需要指定每次加入爲了做一個WHERE用戶?如果沒有必要,每次都加入這些連接將是一種浪費。

回答

5

QueryOver不是LINQ。它使用表達式來指定屬性名稱,但引擎蓋下它的標準,所以它一定相同的規則(所有的連接是顯式)

除非你有一個令人信服的理由,否則儘量不要使用以下:

DbSession.Query<HaveListing>() 
    .Where(h => h.IsModerated == false && 
       h.User.SpammedStatus == false) 
+0

謝謝。我現在不打算使用LINQ提供程序,因爲它對我的WHERE子句做了很奇怪的事情(http://216.121.112.228/browse/NH-2479表明它是SQL Server特有的) - 我在代碼可讀性我會失去SQL可讀性/可能的效率。我會繼續檢查它! – Alastair 2011-02-16 19:46:51

相關問題