2011-03-04 22 views
12

Bir sorunum var. Kişilerim ve Kedilerim var. Her Kişi'nin bazı Kedileri vardır (Kedilerde Kişiler'deki birincil anahtara işaret eden yabancı bir anahtar vardır). Her bir kedinin bir yaşı vardır. "Eski" Kedileri olan Kişileri seçmek istiyorum. Bu kişilerin TÜM Kedilerini istiyorum, sadece "Eski" Kedileri değil. QueryOver sözdizimi ile bunu yapmalıyım. T-SQLQueryOver ve WhereExists ile yardım.

gibi bir şey olurdu: Ben alt sorgular kullanmak zorunda biliyorum

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) 

ve ben (Kriterler/DetachedCriteria) "eski" nhibernate sözdizimi ile kolayca içindi, ama QueryOver sözdiziminde bunu yapamam.

"IN" koşulu istemiyorum. Birincil Anahtarım karmaşık bir anahtardır, bu yüzden IN ile yapamam.

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

cevap

27

Örnek this page alınıp uyarlanan (kendi sınıfları ile test):

hüner bir takma ad kullanıyor görünüyor.

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

Çok teşekkürler! Pazartesi bunu test edeceğim! – xanatos

+0

Çalışıyor !!!!!!!!! :-) – xanatos