12

私は問題があります。私には人と猫がいます。各Personにはいくつかの猫がいます(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 に答える