在NHibernate中引用域对象创建DTO

时间:2013-09-12 23:40:42

标签: nhibernate

我正在编写一个摘要查询,在我的NHibernate 3.3.3.4000项目中进行分组和计数。我有域对象PositionTag,具有多对多关系。一个位置将有一些标签,但随着时间的推移,每个标签将有大量的位置。因此,这种关系是单向的,其中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将删除分组。现在我正在努力解决这个问题。

1 个答案:

答案 0 :(得分:0)

为了回答我自己的问题,我最终创建了一个名为Tag的{​​{1}}子类,它添加了一个count属性。然后我更改了我的查询以选择SummarizedTag的所有单个属性,并计算计数,然后将它们水合成Tag s。因为它们是SummarizedTag的子类,所以在视图中处理它们会更加清晰。如果我要向Tag添加更多属性,我将不得不更新查询;这似乎是不可避免的。

要使用分组查询处理分页,我必须“手动”构建第二个查询,而不是在第一个查询中使用Tag

ToRowCountQuery()