C# 左外连接。。。和查询

C# 左外连接。。。和查询,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有下一个使用QueryOver的Fluent NHibernate查询: IQueryOver<Task> query = session .QueryOver<Task>() .JoinAlias(x => x.Subject, () => subject, JoinType.LeftOuterJoin) .JoinAlias(() => subject.Localizations, () => localization

我有下一个使用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 AND Languages.LanguageId = yyy
WHERE Tasks.UserId = xxx 

是否有方法执行“左外部联接…”和“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);

with子句可以在SELECT的一部分注入到中,但始终使用AND运算符。因此,它只能应用比基本映射关系更多的限制

非常感谢你。您的答案是正确的,但我认为LeftOuterJoin.Mostlikely-correct不需要“| | localization.Language.Id==null”。我试着向他们展示如何。。。所以你是对的……;)只是想展示NHibernate的方式,而不是思考真实的内容。如果有帮助的话,那太好了。享受Nhibernate@Freerider;)(同时更新了答案)感谢您的修复。
/// <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);
/// 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)
)