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));