Помощь с 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( ??? );
Ответы
Ответ 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>();