我有下一个实体:
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 来获取此信息,并减少数据库操作?我的意思是 N+1、附加选择、连接等。
我尝试过的就是使用 NH 的 LINQ,但它仅在 Topic.Id 上进行查询聚合,并且我无法计算任何投票集合。
最佳答案
假设您有一个摘要类来存储您的结果:
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 一对多关系的聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10399448/