我有父子表关系:元素 - (1到n) - > ContentBlocks。每个ContentBlock行都有:唯一ID(Id),ElementId,版本,然后是一些不太相关的字段。我正在尝试获取具有最高版本号(和Id)的所有内容行。
我有这行SQL给了我想要的东西:
SELECT * FROM ContentBlocks WHERE Id IN
(SELECT MAX(Id) FROM ContentBlocks GROUP BY ElementId)
(这假设最新版本具有最高的Id)
然而,我无法弄清楚如何从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个元素的数组列表,Id&amp; ElementId,CreateCriteria调用无法处理。
有没有办法在结果中不包含分组属性“ElementId”?或者指定我想要返回Max(Id)?