我使用NHibernate进行持久化的以下类设置
public class Person { public string Name { get; set; } public IListSubordinates { get; set; } }
现在说我有一个带有两列的网格,"Name"和"Number of Subordinates"在NHibernate中执行此操作的最佳方式是什么,同时尽可能保留域对象的使用.
谢谢
您可以创建一个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