我如何编写使用个createCriteria以下SQL:NHibernate的:个createCriteria和EXISTS子句
SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id)
我如何编写使用个createCriteria以下SQL:NHibernate的:个createCriteria和EXISTS子句
SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id)
我计算出如何使用IsNotEmpty表达做到这一点。这是使用NHibernate LAMBDA扩展:
Session.CreateCriteria<FooBar>()
.Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes))
.List<FooBar>();
这里是你如何能做到这:
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>();
刚走解决的相关问题,并最终抵达我想我会分享这里的答案一个解决方案:
假设你想要原来的问题查询,用在子查询一个附加条件:
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的自动分配到查询根实体(表)的硬编码,但它是我唯一的出路发现从子查询中引用父查询的表的键。
确实......你给了我一个想法,即它可以以更简单的方式完成,而不需要Nhibernate Lambda扩展。我编辑了我的答案以包含该选项。 – tolism7 2009-11-18 01:06:18