【问题标题】:Fluent NHibernate: LEFT OUTER JOIN ... AND Query流畅的 NHibernate:左外连接 ... AND 查询
【发布时间】:2014-09-29 12:01:00
【问题描述】:

我有下一个使用 QueryOver 的 Fluent NHibernate 查询:

IQueryOver<Task> query = session
    .QueryOver<Task>()
    .JoinAlias(x => x.Subject, () => subject, JoinType.LeftOuterJoin)
    .JoinAlias(() => subject.Localizations, () => localization, JoinType.LeftOuterJoin)
    .Where(() => localization.Language.Id == languageId || localization.Language.Id == null);
    .Where(x => x.UserId == userId)

这将执行下一个查询:

SELECT * FROM Tasks left outer join Subjects on Tasks.SubjectId = Subjects.IdAsignatura 
left outer join Languages on Subjects.SubjectId=Languages.SubjectId
WHERE Tasks.UserId = xxx 
and (Languages.LanguageId = yyy or Languages.LanguageId = is null)

我想避免使用“LEFT OUTER JOIN ... AND”的最后一行,如下所示:

SELECT * FROM Tasks left outer join Subjects on Tasks.SubjectId = Subjects.IdAsignatura 
left outer join Languages on Subjects.SubjectId=Languages.SubjectId AND Languages.LanguageId = yyy
WHERE Tasks.UserId = xxx 

有没有办法执行“LEFT OUTER JOIN ... AND”Fluent NHibernate 查询?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

    CreateAlias 有一个重载:

    /// <param name="path">Lambda expression returning association path</param>
    /// <param name="alias">Lambda expression returning alias reference</param>
    /// <param name="joinType">Type of join</param>
    /// <param name="withClause">Additional criterion for the SQL on clause</param>
    /// <returns>
    /// criteria instance
    /// </returns>
    IQueryOver<TRoot, TSubType> JoinAlias<U>(Expression<Func<U>> path
         , Expression<Func<U>> alias, JoinType joinType
         , ICriterion withClause);
    

    也就是说,我们可以将限制从 WHRE 传递到 ON 子句

    /// instead of this
    .JoinAlias(() => subject.Localizations, () => localization, JoinType.LeftOuterJoin)
    .Where(() => localization.Language.Id == languageId 
              || localization.Language.Id == null);
    
    /// We can use this:
    .JoinAlias(() => subject.Localizations, () => localization, JoinType.LeftOuterJoin
                // the 4th param is appended to ON clause with AND operator
                , Restrictions.Where(() => localization.Language.Id == languageId)
    )
    

    withClause 可以注入到我们的 SELECT 的 ON 部分,但始终使用 AND 运算符。所以它只能应用比基本映射关系更多的限制。

    【讨论】:

    • 非常感谢。您的回答是正确的,但我认为 LeftOuterJoin 不需要“|| 本地化.Language.Id == null”。
    • 最有可能 - 正确。我试图展示如何......所以你是对的...... ;) 只是想展示 NHibernate 的 方式 是什么,而不是通过真实的内容进行思考。如果这有帮助,那就太好了。享受 Nhibernate @Freerider ;) (也更新了答案)
    • 感谢您修复它。
    猜你喜欢
    • 2017-10-19
    • 2014-09-17
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2011-08-14
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多