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