2017-09-01 73 views
0

我正在查询两个不同的表。 在第一个查询中,我得到一些Ids,然后我必须在另一个表中检查。 然后我再次用第二个查询的结果做第一个查询。简化多个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();