获得由唯一的ID
问题描述:
行计数让我们假设我有这个简单的n-n
表(people
和product
之间):获得由唯一的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功能更强大,更适合用于这类静态查询。
答
最后,这工作!
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());
编辑:有一个更好的答案(和更简洁)...
谢谢,我知道它,但我使用'CreateCriteria'为其他查询(由每个表定制)。谈论'QueryOver',两者之间是否存在性能差异? –