2017-09-01 17 views
0

私は2つの異なるテーブルでクエリを実行しています。 最初のクエリでは、私は別のテーブルをチェックインする必要があるいくつかのIDを取得します。 次に、2番目のクエリの結果で最初のクエリを再度実行します。複数のnhibernateクエリーオーバーを簡略化

これは、これを行う最善の方法ではありません。

しかし、私はそれを解決する良い方法を見つけていません。だから、いくつかの助けに感謝します。

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(); 

コードは動作しますが、実際は醜いです。

+0

私は私の頭の上をオフに思い出すことはできませんが、これを行うにサブクエリを使用することができるはずです。 http://www.andrewwhitaker.com/blog/2014/10/24/queryover-series-part-8-working-with-subqueries/ –

+0

Linqを使用できますか? –

答えて

0

これにはdetacheCriteriaを使用できます。私は条件のカップルを省略しており、あなたの要件ごとにちょっとひねらなければならないかもしれません。例えば

   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(); 
関連する問題