NHibernate QueryOver を使用した最新の成功した応答を持つリクエストの取得
この例では、すべての Request
エンティティ (それぞれが最後に成功した Response
に関連付けられている) を取得する高度な NHibernate QueryOver クエリを示します。 Request
エンティティには、Response
エンティティのコレクションがあります。 Request
の Response
に基づいて、Response
とその最新の成功した Timestamp
のみをフェッチすることを目指しています。
以下のソリューションでは、ネストされたサブクエリを利用して、この複雑な取得を実現しています。 Response
エンティティに「IsActive」フラグが含まれている場合は、より単純なアプローチが可能になる可能性があります。
これが NHibernate QueryOver 実装です:
<code class="language-c#">// Reference to a Response entity Response responseAlias = null; // Subquery to find the maximum DateTime for each RequestId var maxTimestampSubquery = QueryOver.Of<Response>(() => responseAlias) .SelectList(l => l .SelectGroup(() => responseAlias.RequestId) .SelectMax(() => responseAlias.DateTime) ); // Subquery to find successful Responses with the maximum DateTime var successfulResponseSubquery = QueryOver.Of<Response>(() => responseAlias) .Where(() => responseAlias.Success == true) .WithSubquery .WhereProperty(() => responseAlias.DateTime).In(maxTimestampSubquery); // Main query to retrieve Requests with successful Responses var query = session.QueryOver<Request>(); query.WithSubquery .WhereProperty(r => r.Id) .In(successfulResponseSubquery.Select(r => r.RequestId)); var requests = query.List<Request>();</code>
このコードはサブクエリを使用して、関連する Response
エンティティを効率的に識別し、それらを対応する Request
エンティティにリンクします。 maxTimestampSubquery
は各リクエストの最新のタイムスタンプを検索し、successfulResponseSubquery
はそれらのタイムスタンプに一致する成功した応答をフィルターします。次に、メイン クエリは、成功した応答のサブクエリで見つかった ID に基づいて Request
エンティティを取得します。 Request
と Response
を実際のエンティティ名に置き換え、それに応じてプロパティ名を調整してください。
以上がNHibernate QueryOver を使用して、最新の成功した応答を含むリクエストを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。