Nhibernate QueryOver-为什么必须指定JoinQueryOver

Nhibernate QueryOver-为什么必须指定JoinQueryOver,nhibernate,Nhibernate,在我的NHibernate映射中,我有两个对象-Listing和User。一个用户可以有多个列表,并且(Fluent)映射设置如下: 清单: References<User>(h => h.User).ForeignKey("fk_UserID").Not.LazyLoad().Fetch.Join().Cascade.SaveUpdate(); References(h=>h.User).ForeignKey(“fk_UserID”).Not.LazyLoad().Fetc

在我的NHibernate映射中,我有两个对象-Listing和User。一个用户可以有多个列表,并且(Fluent)映射设置如下:

清单:

References<User>(h => h.User).ForeignKey("fk_UserID").Not.LazyLoad().Fetch.Join().Cascade.SaveUpdate();
References(h=>h.User).ForeignKey(“fk_UserID”).Not.LazyLoad().Fetch.Join().Cascade.SaveUpdate();
用户:

HasMany(u=>u.Listings);
这个很好用。然而,当我开始和QueryOver玩的时候,我试着:

DbSession.QueryOver<HaveListing>()
    .Where(h => h.IsModerated == false)
    .And(h => h.User.SpammedStatus == false)
DbSession.QueryOver()
.其中(h=>h.IsModerated==false)
.和(h=>h.User.spamedStatus==false)
它失败了。然而,这是可行的:

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

显然,使用后者是可以的,但是我想确保我没有遗漏什么——我的关系是在映射中定义的,所以我真的需要每次指定连接以在用户上执行WHERE操作吗?每次不需要时都包含这些连接是一种浪费。

查询不是LINQ。它使用表达式来指定属性名称,但在后台它的条件是相同的,因此它绑定到相同的规则(所有连接都是显式的)

除非有令人信服的理由不这样做,否则请尝试以下方法:

DbSession.Query<HaveListing>()
    .Where(h => h.IsModerated == false &&
                h.User.SpammedStatus == false)
DbSession.Query()
.其中(h=>h.IsModerated==false&&
h、 User.spamedStatus==false)

谢谢。我现在不打算使用LINQ提供程序,因为它对我的WHERE子句做了非常奇怪的事情(表明它是特定于SQL Server的)——我在代码可读性方面获得的好处是在SQL可读性/可能的效率方面失去的。不过我会继续查的!
DbSession.Query<HaveListing>()
    .Where(h => h.IsModerated == false &&
                h.User.SpammedStatus == false)