Добавление условий к внешним соединениям с помощью запроса NHibernate ICriteria / QueryOver - PullRequest
2 голосов
/ 23 марта 2011

Есть ли способ указать дополнительные условия для внешних объединений в NHibernate при запросах с использованием QueryOver или ICriteria?

Мне нужны дополнительные условия для внешней объединяемой таблицы, но NHibernate всегда добавляет их в предложение WHERE в конце, что не дает правильного поведения (см. http://weblogs.sqlteam.com/jeffs/archive/2007/05/14/criteria-on-outer-joined-tables.aspx).

Кажется, я не могу найти способ сделать это, используя Criteria или синтаксис QueryOver ...

Спасибо

Ответы [ 3 ]

9 голосов
/ 14 января 2012

Вы, наверное, поняли это давным-давно. Решение состоит в том, чтобы добавить параметр ICriteria в метод JoinAlias, например:

Party aliasParty = null;
Party aliasPartyFrom = null;
var parties = QueryOver.Of<Party>(() => aliasParty)
              .Left.JoinAlias(
                               () => aliasParty.AccountabilitiesFrom, 
                               () => aliasAccFrom, 
                               Restrictions.On(() => aliasAccFrom.TimeTo).IsNull)

У меня есть ограничение на aliasAccFrom, где я хочу, чтобы TimeTo было нулевым, в последней строке кода.

2 голосов
/ 23 марта 2011

(ответил на мой вопрос - извините!)

Фабио ответил на аналогичный запрос в списке NHibernate - просто подумал, что я опубликую его здесь.

Это возможно с критериями, начиная с NH3.0. Особенность в HQL http://fabiomaulo.blogspot.com/2009/05/nhibernate-210-hql-with-clause.html

С критериями взглянуть на CreateAlias ​​(string associationPath, псевдоним строки, JoinType joinType, ICriterion withClause) CreateCriteria (string associationPath, псевдоним строки, JoinType joinType, ICriterion withClause)

С QueryOver он недоступен, но для этого есть JIRA: https://nhibernate.jira.com/browse/NH-2592

1 голос
/ 27 февраля 2013

я пробовал следующий запрос с запросом более

SystemUser systemUser= null;
SurveyRequests SurveyRequests = null;

var Query2 = Session.QueryOver<SystemUser>(() => systemUser)
               .Left.JoinAlias(() => systemUser.SurveyRequests, 
               () => surveyRequest,
               Restrictions.On(()=>surveyRequest.Survey.Id).IsIn(new object []{surveyID }))
...