2009-11-18 123 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的自动分配到查询根实体(表)的硬编码,但它是我唯一的出路发现从子查询中引用父查询的表的键。