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)?