开发者

How to QueryOver using correlated subqueries over an aggregate value?

I have the following domain mappings:

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

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

translated to a similiar table structure:

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

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

How do i recreate 开发者_JAVA百科the following SQL query using QueryOver?

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, select the latest PersonDetails for each Person. I've seen examples, but neither of them related to a correlated subquery using an aggregae value...

Thanks, Harel


Hey, after sweating hard to find a solution, the following did the trick:

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

so the way for joining the correlated sub-query is by using an alias the 'outer' query.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜