Maison >développement back-end >C++ >Comment récupérer efficacement les demandes avec les dernières réponses réussies à l'aide de NHibernate ?

Comment récupérer efficacement les demandes avec les dernières réponses réussies à l'aide de NHibernate ?

DDD
DDDoriginal
2025-01-15 07:53:14901parcourir

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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn