NHibernate クエリの最適化: 成功した最新の応答を含むリクエストの取得
この記事では、最新の Request
が成功を示す Response
エンティティを取得する効率的な NHibernate クエリを示します。 私たちのデータ モデルには、Request
エンティティのコレクションを持つ Response
エンティティが含まれています。各 Response
には Timestamp
とブール値の Success
プロパティがあります。
このソリューションでは、NHibernate の QueryOver API を使用したマルチレベルのサブクエリ アプローチを採用し、可読性と保守性を向上させています。
内部サブクエリ (maxSubquery
) は、グループ化と集計を使用して各 Request
の最大タイムスタンプを識別します。 2 番目のサブクエリ (successSubquery
) は、これらの最大タイムスタンプをフィルター処理して、対応する Request
が Response
を true としてマークした Success
ID のみを選択します。
エンティティを取得し、Request
で識別された ID に基づいて結果をフィルター処理します。 これにより、正常に完了した最新の応答を持つリクエストのみが返されるようになります。successSubquery
<code class="language-csharp">Response responseAlias = null; var maxSubquery = QueryOver.Of<Response>() .SelectList(l => l .SelectGroup(r => r.RequestId) .SelectMax(r => r.Timestamp)) //Using Timestamp instead of DateTime for clarity .Where(r => r.RequestId == responseAlias.RequestId) .Where(Restrictions.EqProperty( Projections.Max<Response>(r => r.Timestamp), Projections.Property(() => responseAlias.Timestamp))); var successSubquery = QueryOver.Of<Response>(() => responseAlias) .Select(r => r.RequestId) .WithSubquery .WhereExists(maxSubquery) .Where(r => r.Success); //Simplified Success check var query = session.QueryOver<Request>(); query.WithSubquery .WhereProperty(r => r.Id) // Assuming Id is the primary key .In(successSubquery); var requestsWithSuccessfulLatestResponses = query .List<Request>();</code>このアプローチは、必要なデータを効率的に取得し、複雑なデータ関係とクエリの最適化を処理する NHibernate の能力を示しています。 エイリアスを使用すると可読性が向上し、コードが合理化されて明確になります。 一貫性を保つために、
の代わりに Timestamp
を使用することに注意してください。DateTime
以上がNHibernate を使用して、成功した最新の応答を含むリクエストを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。