NHibernate聚合查询一对多关系

时间:2012-05-01 14:52:27

标签: nhibernate linq-to-nhibernate

我有下一个实体:

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
}

我需要从db加载下一个信息 - 所有主题(ID,实际名称,但在此演示案例中无关紧要)和另外两个字段 CountOfVotedUp,CountOfVotedDown(聚合)。因此,正如我在SQL世界中所理解的,我们需要连接,分组依据,案例和计数。

使用LINQ获取此信息并使用较少的db操作是否可行?我的意思是N + 1,额外的选择,连接等。

我尝试过的一切 - 就是使用NH的LINQ,但它只在Topic.Id上进行查询聚合,我无法计算任何Votes集合。

1 个答案:

答案 0 :(得分:3)

如果您有一个汇总类来存储您的结果:

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>();

我想这不完全是你想要的,但希望这会让你走上良好的轨道。