2012-08-10 91 views
1

我有很多困難搞清楚如何在沒有代碼引用對方,例如2個表執行查詢,我有NHibernate的條件查詢子集合的多層次

Customer -> Product* where customer and product have reference to each other 

and 庫存 - >產品*產品無庫存參考

我想找到所有沒有庫存產品的客戶。

我已經這樣做了,到目前爲止

var subQueryInv= DetachedCriteria.For<Inventory>(); 
     subQueryInv 
      .Add(Restrictions.IsNotNull("Product.Id")) 
      .SetProjection(Projections.Property<Inventory>(inv=> inv.Product.Id)); 

     var subQueryProd = DetachedCriteria.For<Product>(); 
     subQueryTire 
      .Add(Subqueries.PropertyNotIn("Id", subQueryInv)) 
      .SetProjection(Projections.Property<Tire>(prod=> prod.Customer.Id)); 

     var subQueryCust= DetachedCriteria.For<Customer>(); 
     subQueryCust 
      .Add(Subqueries.PropertyIn("Id", subQueryProd)) 
      .SetProjection(Projections.Property<TireSet>(cust => cust.Id)); 

這樣的作品,BT的查詢非常innefficient,它生成SQL喜歡本作的庫存部分 ... WHERE Product.Id NOT IN(SELECT庫存.ProductId FROM Inventory WHERE Inventory.ProductId IS NOT NULL)

因此,對於每個產品記錄,它將查詢整個Inventory表。我怎樣才能得到子查詢有這樣的家長ID的參考:

...WHERE Product.Id NOT IN (SELECT Inventory.ProductId FROM Inventory WHERE Inventory.ProductId IS NOT NULL AND Inventory.ProductId = Product.Id) 

回答

2

您可以使用別名來引用的主要標準

var subQueryInv= DetachedCriteria.For<Inventory>(); 
    .Add(Restrictions.IsNotNull("Product.Id")) 
    .Add(Restrictions.PropertyEq("Product", "product")) 
    .SetProjection(Projections.Property<Inventory>(inv => inv.Product.Id)); 

var subQueryProd = DetachedCriteria.For<Product>("product"); 
+0

謝謝,這是相當多我需要的東西,除了我剛剛形成這樣的限制:。新增(Restrictions.EqProperty(「產品。 Id「,」product.Id「)) – getit 2012-08-14 16:19:06