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>(); |
我猜这不是您正在寻找的,但希望这会让您走上正轨。