帮助QueryOver和WhereExists

时间:2011-03-04 14:18:03

标签: c# nhibernate fluent-nhibernate queryover

我有问题。我有人和猫。每个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( ??? );

1 个答案:

答案 0 :(得分:27)

取自this page并改编的示例(使用我自己的课程测试):

诀窍似乎是使用别名。

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