从唯一 ID 获取行数

Get row count from unique ID's

假设我有这个简单的 n-n table(在 peopleproduct 之间):

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

还有这个class(已经映射):

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());

但它总是 returns 一个包含数组的列表 [count, id]:

[3, 1] and [2, 1]

这不是最好的结果,因为这个 table 可以 return 成千上万的 people_id

终于成功了!

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());

编辑:有一个更好的答案(而且不那么冗长)...

使用CountDistinct.

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

顺便说一句,你知道你可以使用 QueryOver,这与更好的语法相同吗? HQL / Linq 更强大,更适合用于像这样的静态查询。