HasMany-Abfrage: Holen Sie sich die Anfrage mit der letzten erfolgreichen Antwort
Betrachten Sie das folgende Volumenmodell:
<code class="language-c#">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; } }</code>
Die Aufgabe besteht darin, eine Abfrage zu erstellen, die alle erfolgreichen Anfragen mit der neuesten Antwort (basierend auf dem Zeitstempel) abruft.
NHibernate-Lösung mit QueryOver
NHibernate bietet eine umfassende Lösung mit QueryOver:
<code class="language-c#">Response responseAlias = null; var maxSubquery = QueryOver.Of<Response>() .SelectList(l => l .SelectGroup(item => item.RequestId) .SelectMax(item => item.Timestamp) // 使用 Timestamp 而不是 DateTime ) .Where(item => item.RequestId == responseAlias.RequestId) .Where(Restrictions.EqProperty( Projections.Max<Response>(item => item.Timestamp), // 使用 Timestamp 而不是 DateTime Projections.Property(() => responseAlias.Timestamp) // 使用 Timestamp 而不是 DateTime )); var successSubquery = QueryOver.Of<Response>(() => responseAlias) .Select(res => res.RequestId) .WithSubquery .WhereExists(maxSubquery) .Where(success => success.Success == true); var query = session.QueryOver<Request>(); query.WithSubquery .WhereProperty(r => r.ID) .In(successSubquery); var list = query.List<Request>();</code>
Diese Abfrage ruft alle Anfragen ab, die mindestens eine erfolgreiche Antwort hatten (die aktuellste basierend auf dem Zeitstempel). DateTime
wurde im Code durch das genauere Timestamp
ersetzt und die Variablenbenennung wurde leicht angepasst, um die Lesbarkeit zu verbessern. Die Kernlogik bleibt dieselbe.
Das obige ist der detaillierte Inhalt vonWie rufe ich mit NHibernate Anfragen mit der neuesten erfolgreichen Antwort ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!