C# NHibernate和收集计数

C# NHibernate和收集计数,c#,nhibernate,C#,Nhibernate,我使用NHibernate为持久性设置了以下类 public class Person { public string Name { get; set; } public IList<Person> Subordinates { get; set; } } 公共类人物 { 公共字符串名称{get;set;} 公共IList下属{get;set;} } 现在假设我有一个包含两列的网格,“Name”和“Number of substance”,在NHibernate中

我使用NHibernate为持久性设置了以下类

public class Person
{
    public string Name { get; set; }
    public IList<Person> Subordinates { get; set; }
}
公共类人物
{
公共字符串名称{get;set;}
公共IList下属{get;set;}
}
现在假设我有一个包含两列的网格,“Name”和“Number of substance”,在NHibernate中这样做的最佳方式是什么,同时尽可能保留域对象的使用


谢谢

假设你的HBM是正确的,此人有很多下属,你只需找到此人,然后打电话给下属。数一数


如果您只需要计数,那么这是一个中度浪费的过程,因为它将完全填充所有的下属集合,以便您获得计数。我认为您最好创建一个方法,该方法接收一个人并返回其下属的计数,然后使用HQL执行实际的计数函数。如果无法执行直接计数函数,则可以让它为每个下属返回一个与Person FK匹配的值,然后对其返回的集合调用.Length或.count。然而,我认为HQL应该能够直接为您计算它。

您可以创建一个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>

你想将人物对象绑定到网格吗?太棒了,我不知道投影的东西!谢谢你,几个小时以来,我一直在尝试制作一个简单的例子。不过,我似乎不需要DTO类的hbm.xml文件。那么,您不需要“导入”类吗?嗯,我以前也应该试试这个……你确定这个查询有效吗?因为我在生成的SQL中遇到了一个错误:not group by for Name property您能在hibernate文件中给出DTO导入的示例吗?有必要吗?
SELECT p.Name, COUNT(p.Subordinates) FROM Person
INNER JOIN Subordinates ON Person.PersonId = Subordinates.PersonID
GROUP BY p.Name