2

我有下一个实体:

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 (aggregates)。因此,据我所知,在 SQL 世界中,我们需要联接、分组、大小写和计数。

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

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

4

1 回答 1

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

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

于 2012-05-02T12:54:59.977 回答