Optimisation des requêtes NHibernate : récupération des requêtes avec les dernières réponses réussies
Cet article présente une requête NHibernate efficace pour récupérer les Request
entités dont la Response
la plus récente indique le succès. Notre modèle de données comprend une Request
entité avec une collection de Response
entités. Chaque Response
a une propriété Timestamp
et une propriété booléenne Success
.
La solution utilise une approche de sous-requête à plusieurs niveaux utilisant l'API QueryOver de NHibernate pour une lisibilité et une maintenabilité améliorées.
La sous-requête interne (maxSubquery
) identifie l'horodatage maximum pour chaque Request
à l'aide du regroupement et de l'agrégation. Une deuxième sous-requête (successSubquery
) filtre ensuite ces horodatages maximum, en sélectionnant uniquement les Request
ID pour lesquels le Response
correspondant a marqué Success
comme vrai.
Enfin, la requête externe récupère les entités Request
, en filtrant les résultats en fonction des identifiants identifiés dans successSubquery
. Cela garantit que seules les demandes avec une dernière réponse complétée avec succès sont renvoyées.
Voici le code C# implémentant cette requête optimisée :
<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>
Cette approche récupère efficacement les données requises, mettant en valeur la puissance de NHibernate dans la gestion des relations de données complexes et l'optimisation des requêtes. L'utilisation d'alias améliore la lisibilité et le code est rationalisé pour plus de clarté. Notez l'utilisation de Timestamp
au lieu de DateTime
par souci de cohérence.
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!