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>
クエリ構築:
望ましい結果を得るために、サブクエリを利用する NHibernate QueryOver クエリを作成できます。
<code class="language-c#">// 响应子查询,查找最大日期响应 var maxSubquery = QueryOver.Of<Response>() .SelectList(l => l .SelectGroup(item => item.RequestId) .SelectMax(item => item.Timestamp)) .Where(item => item.RequestId == response.RequestId) .Where(Restrictions.EqProperty( Projections.Max<Response>(item => item.Timestamp), Projections.Property(() => response.Timestamp))); // 响应子查询,查找具有最大日期的成功响应 var successSubquery = QueryOver.Of<Response>()(() => response) .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>
クエリ命令:
maxSubquery
各リクエストの最大応答日を見つけます。 successSubquery
応答をフィルタリングして、成功し、それぞれのリクエストの最大日付を持つもののみを含めます。 successSubquery
で識別された成功した応答の有無に基づいてリクエストをフィルタリングします。 あるいは、クエリを簡素化するために、応答に「IsActive」プロパティを設定することを検討してください。
以上がNHibernate を使用して最新の成功した応答のみを含むリクエストを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。