NHibernate:如何在CreateCriteria中使用“IN”?

时间:2009-11-24 22:08:48

标签: nhibernate criteria

我有父子表关系:元素 - (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)?

1 个答案:

答案 0 :(得分:0)