2011-03-04 53 views
12

我遇到问题。我有人和猫。每个人都有一些猫(在猫中有一个指向人的主键的外键)。每只猫都有一个年龄。我想选择有“老”猫的人。我想要这些人的所有猫,而不仅仅是“老”猫。 我需要使用QueryOver语法来完成它。使用QueryOver和WhereExists帮助

在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的语法(该标准/ DetachedCriteria之后),但我无法在QueryOver语法中执行此操作。

我不想要一个“IN”条件。我的主键是一个复杂的键,所以我不能用IN来做。从this page取出并适于

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

回答

27

实施例(与我自己的类测试):

诀窍好像是用一个别名。

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

非常感谢!星期一我会测试它! – xanatos 2011-03-04 19:56:45

+0

工作!!!!!!!!! :-) – xanatos 2011-03-07 10:03:44