Условие присоединения nHibernate ICriteria - PullRequest
4 голосов
/ 25 августа 2009

Я пытаюсь использовать ICriteria для создания запроса, который имеет соединение состояние. SQL, который я пытаюсь сгенерировать, должен выглядеть следующим образом

SELECT c.ClientID
FROM Client c
LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID AND
t.ContactType = 'Email'

Если я использую такие критерии, как

m_ClientRepository.QueryAlias("client")
     .CreateCriteria("client.Contacts", "c", JoinType.LeftOuterJoin)
     .Add(Restrictions.Eq("c.ContactType", ContactType.Email));

Он сгенерирует sql, ниже которого я не хочу.

SELECT c.ClientID
FROM Client c
LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID
WHERE t.ContactType = 'Email'

Есть ли способ сделать это с помощью ICriteria или HQL, если ICriteria невозможна?

Редактировать: Я обнаружил, что nHibernate 2.1 (который я использую) теперь разрешает это . Не уверен насчет ICriteria, но это мое предпочтение.

Ответы [ 5 ]

3 голосов
/ 29 августа 2011

Я бы этого не делал. Левое внешнее объединение в любом случае позволяет NH загружать клиентов, фильтр для контактов электронной почты будет загружать только контакты электронной почты ... до тех пор, пока он не инициализирует сбор контактов и не загрузит все равно.

Если он будет загружать только контакты электронной почты, он окажется в незавершенных объектах в памяти. Обычно это не очень хорошая идея, особенно если вы также меняете данные в одной транзакции.

В вашей ситуации я бы попытался загрузить контакты EMail напрямую и перейти от контакта к клиенту.

session.CreateCriteria(typeof(Contact))
     .Add(Restrictions.Eq("c.ContactType", ContactType.Email));
1 голос
/ 01 сентября 2011

Я нашел единственный способ сделать это с помощью NHibernate 3 и раньше - через фильтры, как в этот пример

В NHibernate 3.1 теперь это поддерживается лучше, https://nhibernate.jira.com/browse/NH-2190

1 голос
/ 29 августа 2011

Если вы не найдете способ правильно сформировать join, вы можете сделать простой трюк: просто установите ограничение на WHERE t.ContactType = 'Email' OR t.ClientID IS NULL - надеюсь, это возможно с NHibernate.

0 голосов
/ 30 июля 2011
from s in Session.Linq<Client> left join cc in c.Contacts
        on
        new { c.ClientID , cc.ClientID }
        equals
         new { cc.ContactType, "Email" }
        select c.ClientId;

Надеюсь, это работает, если вы используете Nhibernate 2

0 голосов
/ 26 августа 2009

Вы можете использовать IQuery в сочетании с ISQLQuery. Это не Критериальный механизм, но он может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...