12

我有个问题。我有人和猫。每个 Person 都有一些 Cats(Cats 中有一个外键指向 Persons 中的主键)。每只猫都有一个年龄。我想选择有“老”猫的人。我想要这些人的所有猫,而不仅仅是“老”猫。我需要使用 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( ??? );
4

1 回答 1

28

示例取自此页面并进行了改编(使用我自己的课程进行了测试):

诀窍似乎是使用别名。

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>();
于 2011-03-04T16:36:06.087 回答