Nhibernate QueryOver - 为什么我必须指定JoinQueryOver

时间:2011-02-16 17:50:42

标签: nhibernate

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

清单:

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)

显然,使用后者很好,但我想确保我没有遗漏某些东西 - 我的关系是在映射中定义的,所以我真的需要每次都指定连接以便做一个WHERE用户?如果没有必要,每次包含这些连接都是浪费。

1 个答案:

答案 0 :(得分:5)

QueryOver不是LINQ。它使用表达式来指定属性名称,但是它是标准,因此它绑定到相同的规则(所有连接都是显式的)

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

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