2009-02-10 69 views
3

我使用NHibernateNHibernate和集合计数

进行持久下面的类设置
public class Person 
{ 
    public string Name { get; set; } 
    public IList<Person> Subordinates { get; set; } 
} 

现在说我有两列的网格,“名称”和“下属的号码”什么是做的最好的方法这在NHibernate中尽可能保留域对象的使用。

感谢

+0

你想Person对象绑定到网格? – 2009-02-10 14:18:20

回答

9

您可以创建您用于例如报告/概述一个DTO类... 这个类看起来是这样的:

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

然后,在该标准创建标准查询,在你定义你想要检索所有人。 但是,您可以指定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类。这看起来像

<hibernate-mapping .. > 
    <import class="PersonView" /> 
</hibernate-mapping> 

然后,NHibernate的会为你的标准的查询非常的样子:

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

真棒,不知道预测的东西! – 2009-02-11 13:24:10

0

假设你有HBM纠正人的hasMany下属你可以得到的人,然后调用Subordinates.Count

这是一个适度浪费的过程,如果你需要的是计,因为它会完全填充所有的下属集合,只是让你数。我认为你最好创建一个接受Person的方法,并返回一个他们的下属的计数,并使用HQL来完成一个实际的计数函数。如果你不能做一个直接计数的函数,你可以让它只返回一个匹配Person FK的下属的值,然后在返回的集合上调用.Length或者.Count。不过,我认为HQL应该能够直接为您计算它。