2

Je suis en train de convertir le résultat de la requête en IDictionarycasting Nhibernate résultat dans IDictionary <string,int>

Ici chaîne contiendra orderId et l'int contiendra les TradedQuantity

La requête ci-dessous devrait se joindre à trois objets Ordre, OrderRevision et OrderEvent. 1 Commander peut avoir plusieurs orderRevisions 1 OrderRevision peut avoir de nombreux orderEvents

Ce que la requête essaie de faire est de jointure interne trois objets et obtenir tous les objets de commande dont id ordre correspond à la liste des OrderIDs qui lui sont fournis. Ensuite, il fait un groupe basé sur orderId et obtient le dernier TradedQuantity de l'objet orderEvents. LatestTradedQuantity sera le TradedQuantityFrom dernier OrderEvent. Pour l'instant, le dernier orderevent peut être considéré comme celui qui a la valeur OrderEventId la plus élevée.

OrderRevision revisionAlias = null; 
Order orderAlias = null; 

var query = 
      Session.QueryOver<OrderEvent>() 
       .JoinAlias(oe => oe.OrderRevision,() => revisionAlias) 
       .JoinAlias(oe => oe.OrderRevision.Order,() => orderAlias) 
       .Where(x => x.OrderRevision.Order.SourceSystem.Name.ToLower() == sourceSystem.ToLower()) 
       .WhereRestrictionOn(x => x.OrderRevision.Order.Id).IsIn(orderIds.ToList()) 
       .SelectList(list => list.SelectGroup(x => x.OrderRevision.Order.SourceOrderIdentifier) 
        .SelectMax(x => x.Id).Select(x => x.TradedQuantity)) 
       .Select(x => new KeyValuePair<string, int?>(x.OrderRevision.Order.SourceOrderIdentifier, x.TradedQuantity) 
       ); 

Comme cette requête ne fait pas ce qui est supposé. Pourriez-vous s'il vous plaît aider et laissez-moi savoir comment le résultat peut être jeté dans IDictionary?

Répondre

1

Vous avez étiqueté votre question avec , donc je suppose que l'utiliser au lieu de vous conviendrait. Avec Linq, utilisez une sous-requête pour sélectionner les identifiants des événements de commande "max" pour chaque commande, puis interrogez-les et projetez-les dans un dictionnaire.

using System.Linq; 
using NHibernate.Linq; 

... 

var orderEventsIdsQuery = Session.Query<OrderEvent>() 
    .Where(oe => orderIds.Contains(oe.OrderRevision.Order.Id)) 
    .GroupBy(oe => oe.OrderRevision.Order.SourceOrderIdentifier, 
     (soi, oes) => oes.Max(oe => oe.Id)); 

var result = Session.Query<OrderEvent>() 
    .Where(oe => orderEventsIdsQuery.Contains(oe.Id)) 
    .ToDictionary(oe => oe.OrderRevision.Order.SourceOrderIdentifier, 
     oe => oe.TradedQuantity); 

Cela devrait faire le travail. Je n'utilise pas QueryOver et je ne vais pas essayer de donner une réponse pour le faire avec QueryOver.

+0

Merci pour votre réponse. Je reviendrai vers vous une fois que j'aurai essayé et testé. – Sike12

+0

Merci Frédéric – Sike12