Помощь с QueryOver и WhereExists - PullRequest
       42

Помощь с QueryOver и WhereExists

12 голосов
/ 04 марта 2011

У меня проблема.У меня есть люди и кошки.У каждого персонажа есть несколько кошек (в кошках есть внешний ключ, который указывает на первичный ключ в персонах).У каждого кота свой возраст.Я хочу выбрать людей, у которых есть "старые" кошки.Я хочу ВСЕХ Кошек этих людей, а не только "Старые" Кошки.Мне нужно сделать это с помощью синтаксиса 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 Ответ

27 голосов
/ 04 марта 2011

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

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

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>();
...