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 的 NHibernate 解决方案
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>
此查询检索所有至少有一个成功的响应(基于时间戳为最新)的请求。 代码中将DateTime
替换为更准确的Timestamp
,并对变量命名进行了细微调整,以提高可读性。 核心逻辑保持不变。
以上是如何使用 NHibernate 检索具有最新成功响应的请求?的详细内容。更多信息请关注PHP中文网其他相关文章!