一对多关系的 NHibernate 聚合查询

NHibernate aggregate query for one-to-many relation

我有下一个实体:

1
2
3
4
5
6
7
8
9
10
11
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
}

我需要从数据库加载下一个信息 - 所有主题(ID,实际上是名称,但在这个演示案例中无关紧要)和另外两个字段 CountOfVotedUp、CountOfVotedDown(聚合)。因此,据我所知,在 SQL 世界中,我们需要联接、分组、大小写和计数。

是否可以通过 LINQ 获得此信息而对 db 的操作更少?我的意思是 N 1,其他选择,连接等。

我尝试的所有方法都是使用 NH 的 LINQ,但它的查询仅在 Topic.Id 上聚合,我无法计算任何投票集合。


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

1
2
3
4
5
6
public class  SummaryDTO
{
    public int TopicId { get; set; }
    public VoteType TypeOfVote { get; set; }
    public int VoteCount { get; set; }
}

然后

1
2
3
4
5
6
7
8
9
10
11
12
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>();

我猜这不是您正在寻找的,但希望这会让您走上正轨。