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

Ala*_*air 4 nhibernate

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

清单:

References<User>(h => h.User).ForeignKey("fk_UserID").Not.LazyLoad().Fetch.Join().Cascade.SaveUpdate();
Run Code Online (Sandbox Code Playgroud)

用户:

 HasMany<Listing>(u => u.Listings);
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,当我开始使用QueryOver时,我试过:

DbSession.QueryOver<HaveListing>()
    .Where(h => h.IsModerated == false)
    .And(h => h.User.SpammedStatus == false)
Run Code Online (Sandbox Code Playgroud)

哪个失败了.但是,这有效:

DbSession.QueryOver<HaveListing>()
    .Where(h => h.IsModerated == false)
    .JoinQueryOver(h => h.User)
         .Where(u => u.SpammedStatus == false)
Run Code Online (Sandbox Code Playgroud)

显然,使用后者是好的,但我想确保我没有遗漏某些东西 - 我的关系是在映射中定义的,所以我是否真的需要每次都指定连接以便在用户上执行WHERE?每次没有必要时包含这些连接将是一种浪费.

Die*_*hon 5

QueryOver不是LINQ.它使用表达式来指定属性名称,但在引擎盖下它是Criteria,所以它绑定到相同的规则(所有连接都是显式的)

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

DbSession.Query<HaveListing>()
    .Where(h => h.IsModerated == false &&
                h.User.SpammedStatus == false)
Run Code Online (Sandbox Code Playgroud)