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