2017-09-01 2 views
0

Je fais une requête sur deux tables différentes. Dans la première requête, je reçois des identifiants que je dois ensuite vérifier dans une autre table. Ensuite, je répète la première requête avec le résultat de la deuxième requête.Simplifier plusieurs requêtes nhibernate

Cela ne peut pas être la meilleure façon de procéder.

Mais je n'ai pas trouvé un bon moyen de le résoudre. Donc, de l'aide serait appréciée.

IntOrderInvoiceCostOut y = null; 
var list = session.QueryOver<IntOrderInvoiceCostOut>(() => y) 
       .Where(x => x.IntegrationHandleDate == null) 
       .Select(Projections.Distinct(Projections.Property(() => y.Externalid))) 
       .List<string>(); 
var nonPreliminaryOrders = session.QueryOver<RefImplOrderEntity>() 
       .WhereRestrictionOn(x => x.ExternalId).IsIn(list.ToList()) 
       .Where(x => x.StatusTypeId != 95) 
       .Select(x => x.ExternalId) 
       .List<string>(); 
var finalList = session.QueryOver<IntOrderInvoiceCostOut>() 
       .WhereRestrictionOn(x => x.Externalid).IsIn(nonPreliminaryOrders.ToList()) 
       .Where(x => x.IntegrationHandleDate == null) 
       .OrderBy(x => x.IntegrationCreateDate) 
       .Asc 
       .List(); 

Le code fonctionne ... mais je ne suis pas vraiment moche.

+0

Je ne me souviens pas du haut de ma tête, mais vous devriez être en mesure d'utiliser les sous-requêtes pour ce faire. http://www.andrewwhitaker.com/blog/2014/10/24/queryover-series-part-8-working-with-subqueries/ –

+0

Pouvez-vous utiliser Linq? –

Répondre

0

vous pouvez utiliser detacheCriteria pour cela. J'ai omis quelques conditions et vous pourriez devoir twick un peu selon votre condition.

par exemple

   IntOrderInvoiceCostOut y = null; 
var list = QueryOver.Of<IntOrderInvoiceCostOut>(() => y) 
       .Where(x => x.IntegrationHandleDate == null) 
       .Select(Projections.Distinct(Projections.Property(() => y.Externalid))) 
       .DetachedCriteria; 


var nonPreliminaryOrders = QueryOver.Of<RefImplOrderEntity>() 
          .Where(Subqueries.PropertyIn(nameof(RefImplOrderEntity.ExternalId), list)); 
           .Select(x => x.ExternalId) 
          .DetachedCriteria 



var finalList = session.QueryOver<IntOrderInvoiceCostOut>() 
        .Where(Subqueries.PropertyIn(nameof(IntOrderInvoiceCostOut.ExternalId), nonPreliminaryOrders)); 
        .List();