Подтвердить что ты не робот

Помощь с QueryOver и WhereExists

У меня проблема. У меня есть люди и кошки. У каждого человека есть некоторые Кошки (есть внешний ключ в Cats, который указывает на первичный ключ в Лицах). У каждого кота есть возраст. Я хочу выбрать Лица, у которых есть "старые" кошки. Я хочу ВСЕХ кошек этих людей, а не только "старых" кошек. Мне нужно сделать это с помощью синтаксиса QueryOver.

В T-SQL это будет что-то вроде:

SELECT P.*, C.*
FROM Persons P
LEFT JOIN Cats C
    ON P.Id = C.OwnerId
WHERE EXISTS (
    SELECT 1
    FROM Cats C2
    WHERE P.Id = C2.OwnerId AND C2.Age > 5)

Я знаю, что мне нужно использовать подзапросы, и я мог бы легко использовать "старый" синтаксис nhibernate (Criteria/DetachedCriteria), но я не могу это сделать в синтаксисе QueryOver.

Я НЕ хочу условие "IN". Мой первичный ключ - сложный ключ, поэтому я не могу сделать это с помощью IN.

var persons = session.QueryOver<Person>.WithSubquery.WhereExists( ??? );
4b9b3361

Ответ 1

Пример, взятый из этой страницы и адаптированный (проверенный моими классами):

Трюк, похоже, использует псевдоним.

Person personAlias = null;

IList<Person> persons = 
        session.QueryOver<Person>(() => personAlias).WithSubquery
          .WhereExists(QueryOver.Of<Cat>()
             .Where(c => c.Age > 5)
             .And(c => c.Owner.Id == personAlias.Id)
             .Select(c => c.Owner))
          .List<Person>();