Heim >Backend-Entwicklung >C++ >Wie kann ich mit NHibernate effizient Anfragen mit erfolgreichen letzten Antworten abrufen?

Wie kann ich mit NHibernate effizient Anfragen mit erfolgreichen letzten Antworten abrufen?

DDD
DDDOriginal
2025-01-15 07:53:14945Durchsuche

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

Optimierung von NHibernate-Abfragen: Abrufen von Anfragen mit erfolgreichen letzten Antworten

Dieser Artikel zeigt eine effiziente NHibernate-Abfrage zum Abrufen von Request-Entitäten, bei denen das neueste Response einen Erfolg anzeigt. Unser Datenmodell umfasst eine Request-Entität mit einer Sammlung von Response-Entitäten. Jedes Response hat eine Timestamp- und eine boolesche Success-Eigenschaft.

Die Lösung verwendet einen mehrstufigen Unterabfrageansatz unter Verwendung der QueryOver-API von NHibernate für verbesserte Lesbarkeit und Wartbarkeit.

Die innere Unterabfrage (maxSubquery) identifiziert den maximalen Zeitstempel für jedes Request mithilfe von Gruppierung und Aggregation. Eine zweite Unterabfrage (successSubquery) filtert dann diese maximalen Zeitstempel und wählt nur diejenigen Request-IDs aus, bei denen das entsprechende Response als Success als wahr markiert ist.

Schließlich ruft die äußere Abfrage die Request-Entitäten ab und filtert die Ergebnisse basierend auf den in successSubquery identifizierten IDs. Dadurch wird sichergestellt, dass nur Anfragen mit einer erfolgreich abgeschlossenen letzten Antwort zurückgegeben werden.

Hier ist der C#-Code, der diese optimierte Abfrage implementiert:

<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>

Dieser Ansatz ruft die erforderlichen Daten effizient ab und zeigt die Leistungsfähigkeit von NHibernate bei der Handhabung komplexer Datenbeziehungen und der Abfrageoptimierung. Die Verwendung von Aliasen verbessert die Lesbarkeit und der Code wird aus Gründen der Übersichtlichkeit optimiert. Beachten Sie die Verwendung von Timestamp anstelle von DateTime aus Konsistenzgründen.

Das obige ist der detaillierte Inhalt vonWie kann ich mit NHibernate effizient Anfragen mit erfolgreichen letzten Antworten abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn