Nhibernate 如何在聚合值上使用相关子查询进行查询?

Nhibernate 如何在聚合值上使用相关子查询进行查询?,nhibernate,queryover,Nhibernate,Queryover,我有以下域映射: Person ------ int PersonId IList<PersonDetails> Details; PersonDetails ------------- Person Owner (mapped by using the FK field, PersonId) string Name string Address DateTime UpdateDate 如何使用QueryOver重新创建以下SQL查询 SELECT * FROM Person

我有以下域映射:

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

PersonDetails
-------------
Person Owner (mapped by using the FK field, PersonId)
string Name
string Address
DateTime UpdateDate
如何使用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);
i、 e、为每个人选择最新的个人信息。 我见过一些例子,但它们都与使用aggregae值的相关子查询无关

谢谢,
哈雷尔

嘿,在大汗淋漓地寻找解决办法之后,下面的方法奏效了:

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));
(()=>personAlias)的查询版本 .Left.JoinAlias(p=>p.Details,()=>personDetailsAlias) .WithSubquery.WhereProperty(()=>personDetailsAlias.UpdateDate).Eq( (()=>maxPersonDetailsAlias)的查询版本 .Where(ps=>maxPersonDetailsAlias.Owner.Id==personAlias.Id) .Select(projects.Max(ps=>ps.UpdateDate))) .SelectList(resList=>resList.Select(()=>personAlias.Id)。Select(()=>personDetailsAlias.Id));
因此,连接相关子查询的方法是使用别名“外部”查询。

很抱歉,您的表关系是OneToMany,对吗?哦,很抱歉,我忘记了这个细节-映射确实是一对多关系,因为人们可以“拥有”很多PersonDetails对象。很抱歉,我还没有为您的查询找到解决方案,但是……如果您使用Fluent NHibernate将表映射到模型,并且如果您对Person和PersonDetails的查询始终使用SELECT MAX(UpdateDate),可能我有一个想法:-)
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));