我正在编写一个摘要查询,在我的NHibernate 3.3.3.4000项目中进行分组和计数。我有域对象Position
和Tag
,具有多对多关系。一个位置将有一些标签,但随着时间的推移,每个标签将有大量的位置。因此,这种关系是单向的,其中Position有一组标签,但反之亦然。
我的查询将计算每个标记的位置数,对于连接到某个AcademicTerm
的位置(位置中的标量参考)。以下查询有效:
public IPartialResult<TagSummary> GetTagSummaries(string termCode, int skip, int take)
{
Tag tagAlias = null;
AcademicTerm termAlias = null;
TagSummary summary = null;
var tagQuery = Session.QueryOver<Position>()
.JoinAlias(p => p.Term, () => termAlias)
.Where(() => termAlias.TermCode == termCode)
.JoinQueryOver<Tag>(t => t.Tags, () => tagAlias)
.SelectList(projections => projections
.SelectGroup(p => tagAlias).WithAlias(() => summary.Tag)
.SelectCount(p => p.ID).WithAlias(() => summary.PositionCount))
.TransformUsing(Transformers.AliasToBean<TagSummary>());
var countQuery = tagQuery.ToRowCountQuery().FutureValue<int>();
var resultQuery = tagQuery
.OrderBy(t => t.Name).Asc
.Skip(skip)
.Take(take)
.Future<TagSummary>();
return new PartialResult<TagSummary>(resultQuery, countQuery.Value);
结果类型为TagSummary
:
public class TagSummary
{
public string TagName { get; set; }
public int PositionCount { get; set; }
}
标签名称属性中有什么,但我真正想要的是标签本身。我无法弄清楚如何做到这一点。我在那里有tagAlias
,但我不知道怎么把它放到我的TagSummary中。我是否必须选择Tag
的每个属性?我可以选择Tag的ID值,然后执行另一个查询,但这看起来不太好。
更新
我刚发现计数查询不起作用,因为ToRowCountQuery
将删除分组。现在我正在努力解决这个问题。
答案 0 :(得分:0)
为了回答我自己的问题,我最终创建了一个名为Tag
的{{1}}子类,它添加了一个count属性。然后我更改了我的查询以选择SummarizedTag
的所有单个属性,并计算计数,然后将它们水合成Tag
s。因为它们是SummarizedTag
的子类,所以在视图中处理它们会更加清晰。如果我要向Tag
添加更多属性,我将不得不更新查询;这似乎是不可避免的。
要使用分组查询处理分页,我必须“手动”构建第二个查询,而不是在第一个查询中使用Tag
。
ToRowCountQuery()