2011-04-04 88 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