【发布时间】:2009-11-24 22:08:47
【问题描述】:
我有一个父子表关系:Elements -(1 to n)-> ContentBlocks。每个 ContentBlock 行都有:唯一 Id (Id)、ElementId、Version,然后是一些不太相关的字段。我正在尝试获取所有具有最高版本号(和 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>();
如果我执行子查询,我会得到表中唯一 ElementId 的列表。相反,我需要最新 ContentBlock 的 Id 列表。如果我在子查询中颠倒 SetProjections 的顺序,我只会得到 ElementId 的最大值。
我也试过这种方式:
subquery = DetachedCriteria.For<ContentBlock>()
.SetProjection(
Projections.ProjectionList()
.Add( Projections.Max( "Id" ) )
.Add( Projections.GroupProperty( "ElementId" ) )
);
但这给了我一个包含 2 个元素的数组列表,即 Id 和 ElementId,CreateCriteria 调用无法处理。
有没有办法在结果中不包含分组属性“ElementId”?或者指定我想返回 Max(Id) 代替?
【问题讨论】:
标签: nhibernate criteria