使用 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中文网其他相关文章!