【问题标题】:Create DTO with reference to domain object in NHibernate参考 NHibernate 中的域对象创建 DTO
【发布时间】:2013-09-19 02:39:00
【问题描述】:

我正在我的 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; }
}

里面有 Tag 的 Name 属性,但我真正想要的是 Tag 本身。我不知道该怎么做。我在那里有tagAlias,但我不知道如何将它放入我的TagSummary。我必须选择Tag 的每个属性吗?我可以选择 Tag 的 ID 值,然后执行另一个查询,但这似乎不太好。

更新 我刚刚发现计数查询不起作用,因为ToRowCountQuery 会去掉分组。现在我正在尝试解决这个问题。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    为了回答我自己的问题,我最终创建了一个名为 SummarizedTagTag 子类,它添加了一个计数属性。然后我更改了查询以选择Tag 的所有单个属性,并计算计数,然后将它们水合为SummarizedTags。因为它们是Tag 的子类,所以在视图中处理它们会更简洁一些。如果要向Tag 添加更多属性,则必须更新查询;这似乎是不可避免的。

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

    public IPartialResult<SummarizedTag> GetSummarizedTags(string termCode, int skip, int take)
        {
            Logger.DebugFormat("GetSummarizedTags: termCode={0}, skip={1}, take={2}", termCode, skip, take);
    
            Tag tagAlias = null;
            AcademicTerm termAlias = null;
            SummarizedTag summary = null;
    
            // Get all tags attached to positions in specified term, with their use counts
            var tagQuery = Session.QueryOver<Position>()
                .Where(p => p.Status == PositionStatus.Published)
                .JoinAlias(p => p.Term, () => termAlias)
                .Where(() => termAlias.TermCode == termCode)
                .JoinQueryOver<Tag>(t => t.Tags, () => tagAlias)
                .SelectList(projections => projections
                    .SelectGroup(() => tagAlias.ID).WithAlias(() => summary.ID)
                    .SelectGroup(() => tagAlias.Name).WithAlias(() => summary.Name)
                    .SelectGroup(() => tagAlias.Active).WithAlias(() => summary.Active)
                    .SelectGroup(() => tagAlias.Description).WithAlias(() => summary.Description)
                    .SelectGroup(() => tagAlias.UrlFormatName).WithAlias(() => summary.UrlFormatName)
                    .SelectCountDistinct(p => p.ID).WithAlias(() => summary.Count))
                .TransformUsing(Transformers.AliasToBean<SummarizedTag>())
                .OrderByAlias(() => summary.Count).Desc
                .Skip(skip)
                .Take(take)
                .Future<SummarizedTag>();
    
            // Count tags used in positions in specified term.
            var countQuery = Session.QueryOver<Position>()
                .JoinAlias(p => p.Term, () => termAlias)
                .Where(() => termAlias.TermCode == termCode)
                .JoinQueryOver<Tag>(p => p.Tags, () => tagAlias)
                .Select(Projections.CountDistinct(() => tagAlias.ID))
                .FutureValue<int>();
    
            return new PartialResult<SummarizedTag>(tagQuery, countQuery.Value);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多