我如何編寫使用個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