【问题标题】:NHibernate: How to use "IN" with CreateCriteria?NHibernate:如何在 CreateCriteria 中使用“IN”?
【发布时间】: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


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      相关资源
      最近更新 更多