使用ICriteria的NHibernate相关子查询

使用ICriteria的NHibernate相关子查询,nhibernate,icriteria,correlated-subquery,Nhibernate,Icriteria,Correlated Subquery,我一直在为即将到来的项目评估NHibernate,并且正在通过一些用例来了解它的性能。我还没有找到使用Criteri API表达以下查询的方法 两个相当基本的表格(为了本例的目的,将其删减) 而查询 SELECT P.PersonNo, P.FirstName, P.Surname FROM Persons P JOIN PersonDetails PD ON PD.PersonNo = P.PersonNo AND EffDate = ( SELECT MAX(E

我一直在为即将到来的项目评估NHibernate,并且正在通过一些用例来了解它的性能。我还没有找到使用Criteri API表达以下查询的方法

两个相当基本的表格(为了本例的目的,将其删减)

而查询

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
基本上,我只是尝试将person主记录和最新person修订记录展平到一个对象中。使用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();  
var pdSub=DetachedCriteria.For(“pdSub”)
.SetProjection(
投影。投影列表()
.添加(Projections.Max(“生效日期”)。作为(“MaxEffDate”))
.添加(项目、财产(“人员、人员编号”)为(“人员编号”)
.Add(projects.GroupProperty(“Person.PersonNo”))
.添加(表达式.EqProperty(“pdSub.Person.PersonNo”、“p.PersonNo”));
var p=
会话.创建标准(“p”)
.添加(限制条件Eq(“p.PersonNo”,1))
.Add(subquerys.Eq(“p.PersonNo”,pdSub))
.List();
子查询pdSub已经定义了关系(由PersonNo定义),但是子查询类需要定义另一个关系(例如Eq)

任何帮助都将不胜感激

谢谢,
John

为了演示的目的,我在两个表中都添加了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();
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();
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)