2009-11-24 82 views
1

我有一个父子表关系:元素 - (1到n) - > ContentBlocks。每个ContentBlock行都有:唯一标识(Id),元素标识,版本以及一些不太相关的字段。我试图获取所有具有最高版本号(和Id)的内容行。NHibernate:如何在CreateCriteria中使用“IN”?

我这行SQL的,让我什么,我想:

SELECT * FROM ContentBlocks WHERE Id IN 
    (SELECT MAX(Id) FROM ContentBlocks GROUP BY ElementId) 

(假定最新版本具有最高的编号)

然而,我无法弄清楚如何从NHibernate获取它。这是我得到的最接近的:

var subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(Projections.Max("Id")) 
      .SetProjection(Projections.GroupProperty("ElementId")); 

var query = session.CreateCriteria<ContentBlock>() 
      .Add(Subqueries.PropertyIn("Id", subquery)).List<ContentBlock>(); 

如果我执行子查询,我得到表中唯一的ElementIds列表。相反,我需要最新的ContentBlocks的ID列表。如果我颠倒了子查询上SetProjections的顺序,我只得到了ElementId的最大值。

我也试过这样:

 subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.Max("Id")) 
        .Add(Projections.GroupProperty("ElementId")) 
       ); 

但让我阵列的列表,在这2个元素,标识& ElementId,其中个createCriteria呼叫无法处理。

有没有办法在结果中不包含分组属性“ElementId”?或者指定我想要返回Max(Id)?

回答

相关问题