HasMany Query : obtenez la demande avec la dernière réponse réussie
Considérons le modèle solide suivant :
<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>
La tâche consiste à construire une requête qui récupère toutes les demandes réussies avec la dernière réponse (en fonction de l'horodatage).
Solution NHibernate utilisant QueryOver
NHibernate fournit une solution complète utilisant 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>
Cette requête récupère toutes les requêtes qui ont eu au moins une réponse réussie (la plus récente basée sur l'horodatage). DateTime
a été remplacé par le Timestamp
plus précis dans le code, et le nom des variables a été légèrement ajusté pour améliorer la lisibilité. La logique de base reste la même.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!