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

つまり、各 Person の最新の PersonDetails を選択します。例を見てきましたが、どちらも集計値を使用した相関サブクエリに関連していません...

ありがとう、ハレル

4

1 に答える 1

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

したがって、相関サブクエリを結合する方法は、「外部」クエリのエイリアスを使用することです。

于 2011-04-09T18:57:14.457 に答える