首頁 >後端開發 >C++ >如何使用 NHibernate 高效地檢索具有成功的最新回應的請求?

如何使用 NHibernate 高效地檢索具有成功的最新回應的請求?

DDD
DDD原創
2025-01-15 07:53:14902瀏覽

How to Efficiently Retrieve Requests with Successful Latest Responses Using NHibernate?

最佳化 NHibernate 查詢:擷取具有成功的最新回應的請求

本文示範了一個高效的 NHibernate 查詢來擷取 Request 實體,其中最新的 Response 表示成功。 我們的資料模型包括一個 Request 實體和一組 Response 實體。每個 Response 都有一個 Timestamp 和一個布林 Success 屬性。

此解決方案採用使用 NHibernate 的 QueryOver API 的多層子查詢方法來增強可讀性和可維護性。

內部子查詢 (maxSubquery) 使用分組和聚合來識別每個 Request 的最大時間戳。 然後,第二個子查詢 (successSubquery) 過濾這些最大時間戳,只選擇那些對應 RequestResponse 標記為 true 的 Success ID。

最後,外部查詢檢索 Request 實體,並根據 successSubquery 中標識的 ID 過濾結果。 這可確保僅返回成功完成最新回應的請求。

這是實作此最佳化查詢的 C# 程式碼:

<code class="language-csharp">Response responseAlias = null;
var maxSubquery = QueryOver.Of<Response>()
    .SelectList(l => l
        .SelectGroup(r => r.RequestId)
        .SelectMax(r => r.Timestamp)) //Using Timestamp instead of DateTime for clarity
    .Where(r => r.RequestId == responseAlias.RequestId)
    .Where(Restrictions.EqProperty(
        Projections.Max<Response>(r => r.Timestamp),
        Projections.Property(() => responseAlias.Timestamp)));

var successSubquery = QueryOver.Of<Response>(() => responseAlias)
    .Select(r => r.RequestId)
    .WithSubquery
    .WhereExists(maxSubquery)
    .Where(r => r.Success); //Simplified Success check

var query = session.QueryOver<Request>();
query.WithSubquery
    .WhereProperty(r => r.Id) // Assuming Id is the primary key
    .In(successSubquery);

var requestsWithSuccessfulLatestResponses = query
    .List<Request>();</code>

這種方法可以有效地檢索所需的數據,展示了 NHibernate 在處理複雜數據關係和查詢最佳化方面的強大功能。 別名的使用提高了可讀性,為了清晰起見,程式碼也得到了簡化。 請注意,為了保持一致性,請使用 Timestamp 而不是 DateTime

以上是如何使用 NHibernate 高效地檢索具有成功的最新回應的請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn