Nhibernate获取按列分组的行

本文关键字:获取 Nhibernate | 更新日期: 2023-09-27 18:24:01

简而言之,我想要以下分组功能:http://demos.telerik.com/aspnet-mvc/grid/index然而,我似乎不知道如何使我的后端能够动态地检索这些数据。

我有以下线路:

 query.UnderlyingCriteria.SetProjection(Projections.GroupProperty("PropertyNumber"));

其中查询的类型为IQueryOver。

然而,当我使用时

var statistics = query.List<T>();

我得到

"值''"000000''"不是''"SDS"类型,不能在此通用集合中使用。''r''n参数名称:value"}

000000是默认的属性编号,SDS是我试图分组的对象。对我来说,很明显,我所写的内容是试图将字符串重新作为值。

有趣的是,下面返回了表中的确切行数。

var rowCount = query.RowCount();

那么,我的问题是,如果投影不能达到我想要的效果,我如何以分组的方式返回SDS?

Nhibernate获取按列分组的行

通常有两个问题:

  • 一旦我们使用了投影,我们想要得到的任何其他属性也必须被投影
  • 如果有一个投影,我们需要得到一个实体列表,我们需要结果transformer

有了这些,我们可以得到这样的列表:

// the As() is essential for result transformer
query
    .UnderlyingCriteria
    .SetProjection(Projections.GroupProperty("PropertyNumber")
                              .As("PropertyNumber"));
// set Transformer
query.TransformUsing(Transformers.AliasToBean<T>());
// the list of T, but only PropertyNumber is filled by NHibernate
var list = query.List<T>();

或者这是为了获得更多的属性填充

query
    .UnderlyingCriteria
    .SetProjection(
      Projections.ProjectionList()
        .Add(Projections.GroupProperty("PropertyNumber").As("PropertyNumber"))
        .Add(Projections.Count("ID").As("Count"))
        ....
    )
    ;
// set Transformer to some DTO
query.TransformUsing(Transformers.AliasToBean<U>());
// the list of DTO, with more than PropertyNumber filled
var list = query.List<U>(); // generic U representing DTO

最后,QueryOver API有自己的方法来声明投影

  • 16.6.预测