2014-09-29 2 views
1

У меня есть следующий запрос Fluent NHibernate, используя QueryOver:Fluent NHibernate: LEFT OUTER JOIN ... И Запрос

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 ... И" как это:

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 ... И" Fl uent NHibernate запросы?

ответ

2

Существует одна перегрузка 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); 

Это означает, что мы можем передать Restriction от WHRE в положение о

/// 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 может быть введен в положение ON часть нашего SELECT, но всегда с оператором AND. Таким образом, можно применять только более ограничений, чем основное сопоставленное отношение.

+0

Thak you very much. Ваш ответ правильный, но я думаю, что «|| localization.Language.Id == null» не требуется с LeftOuterJoin. –

+0

Вряд ли - правильно. Я попытался показать КАК ... так что ты прав ...;) Просто хотел показать, что это ** ** с NHibernate, и не продумал реального контента. Отлично, если это помогло. Наслаждайтесь Nhibernate @Freerider;) * (также обновленный ответ) * –

+0

Благодарим вас за исправление. –