我使用NHibernateNHibernate和集合计数
进行持久下面的类设置public class Person
{
public string Name { get; set; }
public IList<Person> Subordinates { get; set; }
}
现在说我有两列的网格,“名称”和“下属的号码”什么是做的最好的方法这在NHibernate中尽可能保留域对象的使用。
感谢
我使用NHibernateNHibernate和集合计数
进行持久下面的类设置public class Person
{
public string Name { get; set; }
public IList<Person> Subordinates { get; set; }
}
现在说我有两列的网格,“名称”和“下属的号码”什么是做的最好的方法这在NHibernate中尽可能保留域对象的使用。
感谢
您可以创建您用于例如报告/概述一个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
真棒,不知道预测的东西! – 2009-02-11 13:24:10
假设你有HBM纠正人的hasMany下属你可以得到的人,然后调用Subordinates.Count
这是一个适度浪费的过程,如果你需要的是计,因为它会完全填充所有的下属集合,只是让你数。我认为你最好创建一个接受Person的方法,并返回一个他们的下属的计数,并使用HQL来完成一个实际的计数函数。如果你不能做一个直接计数的函数,你可以让它只返回一个匹配Person FK的下属的值,然后在返回的集合上调用.Length或者.Count。不过,我认为HQL应该能够直接为您计算它。
你想Person对象绑定到网格? – 2009-02-10 14:18:20