NHibernate 一对多关系的聚合查询

标签 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
}

我需要从数据库加载下一个信息 - 所有主题(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/

相关文章:

nhibernate - 我可以使用 nhibernate 判断某个属性是否脏吗?

c# - 无法找到 Net Core NHibernate System.Data.SQLite

c# - 为什么我的 NHibernate 查询这么慢?

c# - C# 中延迟执行和懒惰求值的区别

c# - 将多个 ORDER BY 子句添加到 NHibernate 查询会引发异常

nhibernate - QueryOver 语句以 DateTime 降序选择 N 行

c# - 意外的 Linq 行为 - ToList()

c# - 使用 Autofac 将对象注入(inject) MassTransit Saga

wcf - 从 n 层客户端遍历对象图

c# - 从 NHibernate 子查询中仅选择某些属性