首页 >后端开发 >C++ >如何使用 NHibernate 检索仅包含最新成功响应的请求?

如何使用 NHibernate 检索仅包含最新成功响应的请求?

Susan Sarandon
Susan Sarandon原创
2025-01-15 10:20:44583浏览

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

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn