我使用NHibernate进行持久化的以下类设置
public class Person
{
public string Name { get; set; }
public IList<Person> Subordinates { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在说我有一个带有两列的网格,"Name"和"Number of Subordinates"在NHibernate中执行此操作的最佳方式是什么,同时尽可能保留域对象的使用.
谢谢
Fre*_*els 10
您可以创建一个DTO类,用于实例报告/概述......此类可能如下所示:
public class PersonView
{
public string Name{ get;set; }
public int NumberOfSubordinates{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
然后,您创建一个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));
Run Code Online (Sandbox Code Playgroud)
像上面这样的东西.(我没有测试你的具体情况).然后,你只需要让NHibernate知道PersonView类的存在,只需"导入"这个类即可.我有一个hbm.xml文件,我导入了所有的DTO类.这看起来像
<hibernate-mapping .. >
<import class="PersonView" />
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
然后,NHibernate将为您的Criteria生成一个几乎看起来像的查询:
SELECT p.Name, COUNT(p.Subordinates) FROM Person
INNER JOIN Subordinates ON Person.PersonId = Subordinates.PersonID
GROUP BY p.Name
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3887 次 |
最近记录: |