2009-11-18 124 views

回答

3

我計算出如何使用IsNotEmpty表達做到這一點。這是使用NHibernate LAMBDA擴展:

Session.CreateCriteria<FooBar>() 
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes)) 
    .List<FooBar>(); 
+0

確實......你給了我一個想法,即它可以以更簡單的方式完成,而不需要Nhibernate Lambda擴展。我編輯了我的答案以包含該選項。 – tolism7 2009-11-18 01:06:18

28

這裏是你如何能做到這:

var fooBars = Session.CreateCriteria<FooBar>() 
     .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>(); 

...假設有一個集合屬性(一對多)FooBar對象中的「Bazs」。

另外,您可以用超然的標準像:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id")); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 
+0

非常好!謝謝! – ldp615 2010-12-03 09:01:48

+0

這幫助我解決了NHIBERNATE錯誤:「找不到匹配的標準信息提供者」,謝謝你的簡單例子。 – Timbob 2013-01-04 15:02:16

5

剛走解決的相關問題,並最終抵達我想我會分享這裏的答案一個解決方案:

假設你想要原來的問題查詢,用在子查詢一個附加條件:

SELECT * FROM FooBar fb 
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id 
       AND Quantity = 5) 

假設你對巴茲類的父級的引用,叫,說FooBarRef [中流利地圖類,你會使用引用()方法],你會創建如下查詢:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id")) 
     .Add(Expression.Eq("baz.Quantity", 5)); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 

我不是100%確信有關別名「本」,這是別名NHibernate的自動分配到查詢根實體(表)的硬編碼,但它是我唯一的出路發現從子查詢中引用父查詢的表的鍵。