获得由唯一的ID

问题描述:

行计数让我们假设我有这个简单的n-n表(peopleproduct之间):获得由唯一的ID

//id people_id product_id 
    1   1   1 
    2   1   3 
    3   1   5 
    4   2   1 

这个类(已映射):

public class PeopleProduct 
{ 
    public virtual int TableId { get; set; } //Mapped to id 
    public virtual int PeopleId { get; set; } //Mapped to people_id 
    public virtual Product Product { get; set; } //Mapped to product_id 
} 

,你可以看,有两个people,第一个有3个products,第二个只有1个。

如何使用CreateCriteria获得唯一people_id的计数?

我目前正试图用这一个:

var crit = StatelessSession.CreateCriteria<PeopleProduct>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Count<PeopleProduct>(c => c.PeopleId)) 
     .Add(Projections.Group<PeopleProduct>(g => g.PeopleId))); 

var count = Convert.ToInt64(crit.UniqueResult()); 

但它总是返回一个列表与一个数组[统计,ID]:

[3, 1] and [2, 1] 

这是不是最好的结果,因为此表可能会返回数千个people_id

使用CountDistinct

var numberOfDistinctPeople = StatelessSession.CreateCriteria<PeopleProduct>() 
    .SetProjection(Projections.CountDistinct<PeopleProduct>(c => c.PeopleId)) 
    .UniqueResult(); 

顺便问一下,你可知道,你可以使用QueryOver,这是一个更好的语法一样吗? HQL/Linq功能更强大,更适合用于这类静态查询。

+0

谢谢,我知道它,但我使用'CreateCriteria'为其他查询(由每个表定制)。谈论'QueryOver',两者之间是否存在性能差异? –

最后,这工作!

var crit = StatelessSession.CreateCriteria<PeopleProduct>() 
    .SetProjection(Projections.ProjectionList() 
      .Add(Projections.Count(Projections.Distinct(
        Projections.Property<PeopleProduct>(p => p.PeopleId))))); 

var count = Convert.ToInt64(crit.UniqueResult()); 

编辑:有一个更好的答案(和更简洁)...