NHibernate的汇总查询一个一对多关系(NHibernate aggregate query

2019-07-29 05:34发布

我有下一个实体:

class Topic
{
    public virtual int Id {get; private set;} 
    public virtual ICollection<Vote> Votes {get; private set; }
}

class Vote
{
    public virtual Topic Topic {get; private set;}
    public virtual VoteType VotedTo {get; private set;} // enum VotedUp, VotedDown
}

我需要从数据库加载下一个信息-所有主题(IDS,实际上名称,但在这种情况下,演示它并不重要)和两个字段CountOfVotedUp,CountOfVotedDown(聚集)。 因此,正如我在SQL世界了解我们需要加入,GROUP BY情况和计数。

难道是更多钞票来获得与LINQ这个信息与数据库操作较少? 我的意思是N + 1,附加的选择,连接等

所有这一切我想 - 就是用NH的LINQ,但它的查询只聚集在Topic.Id,我不能指望任何投票收藏。

Answer 1:

只要你有一个总结类来存储你的结果:

public class  SummaryDTO
{
    public int TopicId { get; set; }
    public VoteType TypeOfVote { get; set; }
    public int VoteCount { get; set; }
}

然后

Vote voteAlias = null;
SummaryDTO result = null;

youNHSession.QueryOver<Topic>()
  .JoinAlias(x=> x.Votes, ()=>voteAlias)
  .SelectList(
    list=>list
      .SelectGroup(topic=>topic.Id).WithAlias(()=>result.TopicId)            
      .SelectGroup(()=>voteAlias.VotedTo).WithAlias(()=>result.TypeOfVote)
      .SelectCount(()=>voteAlias.VotedTo).WithAlias(()=>result.VoteCount ))
  .TransformUsing(Transformers.AliasToBean<SummaryDTO>())
  .List<SummaryDTO>();

我想这是不是你正在寻找什么,但希望这将花费你一个良好的轨道。



文章来源: NHibernate aggregate query for one-to-many relation