Fluent NHibernate:左外连接..AND查询
本文关键字:连接 AND 查询 NHibernate Fluent | 更新日期: 2023-09-27 18:25: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查询?
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运算符。因此,它只能应用比基本映射关系更多的限制。