2011-02-16 53 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