Maison >développement back-end >C++ >Comment récupérer les requêtes avec la dernière réponse réussie à l'aide de QueryOver de NHibernate ?

Comment récupérer les requêtes avec la dernière réponse réussie à l'aide de QueryOver de NHibernate ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-15 07:07:45316parcourir

How to Retrieve Requests with the Latest Successful Response Using NHibernate's QueryOver?

Récupération des requêtes avec la réponse réussie la plus récente à l'aide de QueryOver de NHibernate

Dans les scénarios impliquant une relation un-à-plusieurs (HasMany) entre les entités Request et Response, récupérer efficacement tous les objets Request associés à leur dernier Response réussi est une tâche courante. Cela peut être accompli avec élégance à l'aide de l'API QueryOver de NHibernate.

Examinons un modèle simplifié :

<code class="language-csharp">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; }
    public virtual Request Request { get; set; } // Added for clarity
}</code>

Les étapes suivantes montrent comment construire la requête QueryOver :

<code class="language-csharp">// Subquery to identify the maximum timestamp for successful responses per Request
Response responseAlias = null;
IQueryOver<Response> subquery = QueryOver.Of<Response>(() => responseAlias)
    .Where(r => r.Request.Id == responseAlias.Request.Id) // Join condition
    .Select(Projections.Max<Response>(r => r.Timestamp));

// Subquery to filter for successful responses with the maximum timestamp
IQueryOver<Response> successSubquery = QueryOver.Of<Response>(() => responseAlias)
    .WithSubquery.WhereProperty(r => r.Timestamp).Eq(subquery)
    .Where(r => r.Success == true);


// Main query to retrieve Requests
Request requestAlias = null;
IQueryOver<Request> query = session.QueryOver<Request>(() => requestAlias);
query.WithSubquery.WhereExists(() => successSubquery);

// Execute the query
IList<Request> requests = query.List();</code>

Cette approche exploite les sous-requêtes pour filtrer efficacement les Request entités en fonction de l'existence d'une Response réussie avec l'horodatage le plus récent, reflétant la fonctionnalité d'une requête SQL complexe au sein de la base de données elle-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!

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