使用 NHibernate 的 QueryOver 检索具有最近成功响应的请求
在涉及 Request
和 Response
实体之间一对多关系 (HasMany) 的场景中,高效获取与其最新成功的 Request
关联的所有 Response
对象是一项常见任务。 这可以使用 NHibernate 的 QueryOver API 优雅地完成。
让我们检查一个简化的模型:
<code class="language-csharp">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; } public virtual Request Request { get; set; } // Added for clarity }</code>
以下步骤演示了如何构建 QueryOver 查询:
<code class="language-csharp">// Subquery to identify the maximum timestamp for successful responses per Request Response responseAlias = null; IQueryOver<Response> subquery = QueryOver.Of<Response>(() => responseAlias) .Where(r => r.Request.Id == responseAlias.Request.Id) // Join condition .Select(Projections.Max<Response>(r => r.Timestamp)); // Subquery to filter for successful responses with the maximum timestamp IQueryOver<Response> successSubquery = QueryOver.Of<Response>(() => responseAlias) .WithSubquery.WhereProperty(r => r.Timestamp).Eq(subquery) .Where(r => r.Success == true); // Main query to retrieve Requests Request requestAlias = null; IQueryOver<Request> query = session.QueryOver<Request>(() => requestAlias); query.WithSubquery.WhereExists(() => successSubquery); // Execute the query IList<Request> requests = query.List();</code>
此方法利用子查询根据具有最新时间戳的成功 Request
的存在来有效过滤 Response
实体,镜像数据库本身内复杂 SQL 查询的功能。
以上是如何使用 NHibernate 的 QueryOver 检索具有最新成功响应的请求?的详细内容。更多信息请关注PHP中文网其他相关文章!