ホームページ >バックエンド開発 >C++ >NHibernate を使用して最新の成功した応答を含むリクエストを取得するにはどうすればよいですか?

NHibernate を使用して最新の成功した応答を含むリクエストを取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-15 06:35:43742ブラウズ

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

HasMany クエリ: 最新の成功した応答を含むリクエストを取得します

次のソリッド モデルを考えてみましょう:

<code class="language-c#">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; }
}</code>

タスクは、成功したすべてのリクエストを最新の応答 (タイムスタンプに基づいて) で取得するクエリを構築することです。

QueryOver を使用した Hibernate ソリューション

NHibernate は、QueryOver を使用した包括的なソリューションを提供します。

<code class="language-c#">Response responseAlias = null;

var maxSubquery = QueryOver.Of<Response>()
    .SelectList(l => l
        .SelectGroup(item => item.RequestId)
        .SelectMax(item => item.Timestamp) // 使用 Timestamp 而不是 DateTime
    )
    .Where(item => item.RequestId == responseAlias.RequestId)
    .Where(Restrictions.EqProperty(
        Projections.Max<Response>(item => item.Timestamp), // 使用 Timestamp 而不是 DateTime
        Projections.Property(() => responseAlias.Timestamp) // 使用 Timestamp 而不是 DateTime
    ));

var successSubquery = QueryOver.Of<Response>(() => responseAlias)
    .Select(res => res.RequestId)
    .WithSubquery
    .WhereExists(maxSubquery)
    .Where(success => success.Success == true);

var query = session.QueryOver<Request>();
query.WithSubquery
    .WhereProperty(r => r.ID)
    .In(successSubquery);

var list = query.List<Request>();</code>

このクエリは、少なくとも 1 つの成功応答 (タイムスタンプに基づく最新のもの) があったすべてのリクエストを取得します。 コード内の DateTime はより正確な Timestamp に置き換えられ、読みやすさを向上させるために変数の名前がわずかに調整されました。 核となるロジックは変わりません。

以上がNHibernate を使用して最新の成功した応答を含むリクエストを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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