NHibernate の QueryOver を使用した最新の成功した応答を持つリクエストの取得
Request
エンティティと Response
エンティティ間の 1 対多の関係 (HasMany) が関係するシナリオでは、最後に成功した Request
に関連付けられたすべての Response
オブジェクトを効率的にフェッチすることが一般的なタスクです。 これは、NHibernate の QueryOver API を使用してエレガントに実現できます。
単純化されたモデルを調べてみましょう:
<code class="language-csharp">public class Request { public virtual IList<Response> Responses { get; set; } } public class Response { public virtual DateTime Timestamp { get; set; } public virtual bool Success { get; set; } public virtual Request Request { get; set; } // Added for clarity }</code>
次の手順は、QueryOver クエリを構築する方法を示しています。
<code class="language-csharp">// Subquery to identify the maximum timestamp for successful responses per Request Response responseAlias = null; IQueryOver<Response> subquery = QueryOver.Of<Response>(() => responseAlias) .Where(r => r.Request.Id == responseAlias.Request.Id) // Join condition .Select(Projections.Max<Response>(r => r.Timestamp)); // Subquery to filter for successful responses with the maximum timestamp IQueryOver<Response> successSubquery = QueryOver.Of<Response>(() => responseAlias) .WithSubquery.WhereProperty(r => r.Timestamp).Eq(subquery) .Where(r => r.Success == true); // Main query to retrieve Requests Request requestAlias = null; IQueryOver<Request> query = session.QueryOver<Request>(() => requestAlias); query.WithSubquery.WhereExists(() => successSubquery); // Execute the query IList<Request> requests = query.List();</code>
このアプローチでは、サブクエリを利用して、最新のタイムスタンプを持つ成功した Request
の存在に基づいて Response
エンティティを効率的にフィルタリングし、データベース自体内の複雑な SQL クエリの機能をミラーリングします。
以上がNHibernate の QueryOver を使用して、最新の成功した応答を含むリクエストを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。