使用ICriteria的NHibernate相关子查询
问题描述:
我一直在做一些评估即将到来的项目的NHibernate的工作,并且正在通过一些用例来了解它如何执行。我还没有找到一种方法来使用Criteri API来表达下面的查询。使用ICriteria的NHibernate相关子查询
两个非常基本的表(上剪下来的这个例子的目的)
CREATE TABLE Person
(
PersonNo INT,
BirthDate DATETIME
)
CREATE TABLE PersonDetails
(
PersonNo INT,
FirstName VARCHAR(30),
Surname VARCHAR(30)
)
和查询......
SELECT P.PersonNo, P.FirstName, P.Surname
FROM Persons P
JOIN PersonDetails PD
ON PD.PersonNo = P.PersonNo
AND EffDate =
(
SELECT MAX(EffDate)
FROM PersonDetails
WHERE PersonNo = PD.PersonNo
)
WHERE P.PersonNo = 1
基本上,我只是想变平的人的主记录和最新的人修改记录合并为一个对象。我能够使用HQL轻松完成此操作,但无法使相关子查询正常工作。
这是我的尝试。
var pdSub = DetachedCriteria.For<PersonRevision>("pdSub")
.SetProjection(
Projections.ProjectionList()
.Add(Projections.Max("EffDate").As("MaxEffDate"))
.Add(Projections.Property("Person.PersonNo").As("PersonNo"))
.Add(Projections.GroupProperty("Person.PersonNo")))
.Add(Expression.EqProperty("pdSub.Person.PersonNo", "p.PersonNo"));
var p =
session.CreateCriteria<Person>("p")
.Add(Restrictions.Eq("p.PersonNo", 1))
.Add(Subqueries.Eq("p.PersonNo", pdSub))
.List();
子查询pdSub已定义的关系(由PersonNo),但子查询类需要另一关系来定义(例如等式)?
任何帮助,将不胜感激。
感谢, 约翰
答
对于我添加EffDate到两个表进行演示的目的。希望与您的模型相匹配并适当演示这种加入。
DetachedCriteria subQuery = DetachedCriteria
.For<PersonDetails>("pd")
.SetProjection(Projections.Max("pd.EffDate"))
.Add(Restrictions.EqProperty("pd.PersonId", "p.PersonId"));
IList results = Session
.CreateCriteria(typeof(Person), "p")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("p.PersonId").As("PersonId"))
.Add(Projections.Property("p.EffDate").As("MaxEffDate")))
.Add(Subqueries.PropertyEq("p.EffDate", subQuery))
.List();
的SQL的NHibernate是在服务器扔看起来像这样...
SELECT this_.PersonId as y0_, this_.EffDate as y1_ FROM Person this_ WHERE this_.EffDate = (SELECT max(this_0_.EffDate) as y0_ FROM PersonDetails this_0_ WHERE this_0_.PersonId = this_.PersonId)