Heim >Backend-Entwicklung >C++ >Wie kann ich mit NHibernate effizient Anfragen mit erfolgreichen letzten Antworten abrufen?
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!