2011-04-04 93 views
3

我有以下域映射:如何查詢使用相關子查詢的聚合值?

Person 
------ 
int PersonId 
IList<PersonDetails> Details; 

PersonDetails 
------------- 
Person Owner (mapped by using the FK field, PersonId) 
string Name 
string Address 
DateTime UpdateDate 

翻譯成一個類似的表結構:

Person 
------ 
PersonId (int) 
Birthday (date) 

PersonDetails 
------------- 
PersonId (FK, integer) 
Name (string) 
Address (string) 
UpdateDate (date) 

我如何重新使用QueryOver下面的SQL查詢?

SELECT * 
FROM Person p INNER JOIN Details d ON p.PersonId = d.PersonId 
WHERE d.UpdateDate = (SELECT MAX(UpdateDate) 
         FROM PersonDetails 
         WHERE PersonId = p.PersonId); 

即,爲每個人選擇最新的PersonDetails。 我見過的例子,但他們都沒有涉及到使用aggregae值相關子查詢的...

感謝, 哈雷爾

+0

對不起,你的餐桌關係是OneToMany,對嗎? – Faber 2011-04-04 17:51:31

+0

哦,對不起,我忘了這個細節 - 映射確實是一對多的關係,因爲Person可以「擁有」許多PersonDetails對象。 – 2011-04-04 21:35:26

+0

對不起,但我還沒有找到你的查詢的解決方案,但是...如果你使用流利的NHibernate映射你的表到你的模型,如果你對Person和PersonDetails的查詢總是使用SELECT MAX(UpdateDate)也許我有一個想法:-) – Faber 2011-04-06 09:30:52

回答

14

嘿,出汗很難找到一個解決方案後,下面的伎倆:

QueryOver.Of<Person>(() => personAlias) 
    .Left.JoinAlias(p => p.Details,() => personDetailsAlias) 
    .WithSubquery.WhereProperty(() => personDetailsAlias.UpdateDate).Eq(
      QueryOver.Of<PersonDetails>(() => maxPersonDetailsAlias) 
       .Where(ps => maxPersonDetailsAlias.Owner.Id == personAlias.Id) 
       .Select(Projections.Max<PersonDetails>(ps => ps.UpdateDate))) 
        .SelectList(resList => resList.Select(() => personAlias.Id).Select(() => personDetailsAlias.Id)); 

所以加入相關子查詢的方式是使用別名'外部'查詢。

+0

救世主! – Mani 2014-10-08 17:00:11