ホームページ >バックエンド開発 >C++ >NHibernate の QueryOver を使用して、最新の成功した応答を含むリクエストを取得する方法

NHibernate の QueryOver を使用して、最新の成功した応答を含むリクエストを取得する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-15 07:07:45346ブラウズ

How to Retrieve Requests with the Latest Successful Response Using NHibernate's QueryOver?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。