从唯一 ID 获取行数
Get row count from unique ID's
假设我有这个简单的 n-n
table(在 people
和 product
之间):
//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 更强大,更适合用于像这样的静态查询。
假设我有这个简单的 n-n
table(在 people
和 product
之间):
//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 更强大,更适合用于像这样的静态查询。