Nhibernate获取按列分组的行

时间:2014-09-23 15:23:45

标签: c# sql nhibernate

简而言之,我想要以下分组功能:http://demos.telerik.com/aspnet-mvc/grid/index 但是,我似乎无法弄清楚如何使我的后端动态检索这些数据。

我有以下一行:

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

其中查询的类型为IQueryOver。

然而,当我使用

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

我得到了

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

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

有趣的是,以下内容返回表中的确切行数。

var rowCount = query.RowCount();

我的问题是,如果投影不能做我想要的,我如何以分组的方式实际返回SDS?

1 个答案:

答案 0 :(得分:2)

一般有两个问题:

  • 一旦我们使用了投影,我们想要获得的任何其他财产也必须被投射。
  • 如果有投影,我们需要获取实体列表,我们需要结果变压器

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

// 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有自己的方式来声明投影