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

转换为类似的表结构:
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。
我见过示例,但它们都与使用聚合值的相关子查询无关......

谢谢,
哈雷尔

最佳答案

哎,苦苦寻找解决办法后,下面的方法成功了:

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

所以加入相关子查询的方法是使用别名“外部”查询。

关于nhibernate - 如何在聚合值上使用相关子查询进行 QueryOver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5540675/

相关文章:

c# - 如何使用 NHibernate 查询键值集合?

c# - Nhibernate LINQ - 缓存问题

c# - Nhibernate 查询超时而 sql 查询没有

c# - 从表中仅选择几列

c# - NHibernate session 应该如何在 Nancy 中处理每个请求的 session ?

NHibernate:将子实体投影到父属性中会引发异常

c# - 为什么 IQueryOver 有 2 个类型参数?

c# - NHibernate 3.2 QueryOver 按属性区分

c# - nHibernate Distinct 和分页的问题

oracle - NHibernate 2.1 和 Oracle 10g 客户端出错