当前位置:  开发笔记 > 编程语言 > 正文

NHibernate和收集计数

如何解决《NHibernate和收集计数》经验,为你挑选了1个好方法。

我使用NHibernate进行持久化的以下类设置

public class Person
{
    public string Name { get; set; }
    public IList Subordinates { get; set; }
}

现在说我有一个带有两列的网格,"Name"和"Number of Subordinates"在NHibernate中执行此操作的最佳方式是什么,同时尽可能保留域对象的使用.

谢谢



1> Frederik Ghe..:

您可以创建一个DTO类,用于实例报告/概述......此类可能如下所示:

public class PersonView
{
     public string Name{ get;set; }
     public int NumberOfSubordinates{get;set;}     
}

然后,您创建一个Criteria查询,在您定义的Criteria中,您要检索所有人员.但是,您可以指定NHibernate不应返回Person对象,而应返回PersonView对象.为了能够做到这一点,您需要使用投影和AliasToBeanTransformer:

ICriteria crit = new Criteria(typeof(Person));

crit.SetProjection (Projections.ProjectionList()
                       .Add (Projections.Property("Name"), "Name")
                       .Add (Projections.Count ("Subordinates"), "NumberOfSubordinates");

crit.SetResultTransformer(Transformers.AliasToBean (typeof(PersonView));

像上面这样的东西.(我没有测试你的具体情况).然后,你只需要让NHibernate知道PersonView类的存在,只需"导入"这个类即可.我有一个hbm.xml文件,我导入了所有的DTO类.这看起来像


  

然后,NHibernate将为您的Criteria生成一个几乎看起来像的查询:

SELECT p.Name, COUNT(p.Subordinates) FROM Person
INNER JOIN Subordinates ON Person.PersonId = Subordinates.PersonID
GROUP BY p.Name

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有