无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键

Posted

技术标签:

【中文标题】无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键【英文标题】:Can't retrieve Group By entities or by composite keys with Nhibernate's Linq 【发布时间】:2011-06-03 08:54:38 【问题描述】:

我正在尝试使用 NH3 通过 Linq 查询执行分组。 了解底层 SQL 困难我知道这是不可能的,但理想情况下,我想按一个实体进行分组并完整检索它。 比如:

var list = from proposals in Session.Query<Proposal>()
           group proposals by proposals.Job
           into jobGrouping
           select new 
               Job = jobGrouping.Key, 
               TotalProposals = jobGrouping.Count()
           ;

这会生成一个非法的 SQL 查询,因为它试图检索整个 Job 实体,但仅按其 Id 分组。

我尝试过按复合字段分组:

 var list = from proposals in Session.Query<Proposal>()
                   group proposals by new  proposals.Job.Name, proposals.Job.Status
                   into jobGrouping
                   select new 
                      Job = jobGrouping.Key.Name, 
                      Status = jobGrouping.Key.Status, 
                      TotalProposals = jobGrouping.Count()
                   ;

但是每当我尝试这个时,当 NHibernate 尝试构建一个表达式树时,我都会得到一个异常:

已添加具有相同密钥的项目。

任何人都知道是否有任何方法可以使用 NHibernate 实现这一目标?

谢谢, 宜兰

【问题讨论】:

+1 我也有同样的问题 nhibernate.jira.com/browse/NH-3027 与您的(第一个)问题相关 - 自 NH 3.2 起仍未解决 【参考方案1】:

我在尝试多次使用 .Join 扩展方法时遇到了类似的问题,其中表达式树别名直接取自 lambda 参数名称。

我对 SQL Like linq 语法的了解有限,但我认为它会以某种方式转化为自动分配 lambda 别名名称的流利等价物。

如果是这样,有可能将其转换为具有明确唯一 labmda 别名的流畅语法,您可以避免该问题

【讨论】:

以上是关于无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键的主要内容,如果未能解决你的问题,请参考以下文章

插入 nhibernate sql server 后无法检索生成的 id

使用 String.IsNullOrEmpty(string) 和 Nhibernate 创建动态 Linq 表达式

LINQ Fluent NHIBERNATE .Contains() 在 QueryOver<> 中不起作用,但在 Query<> 中起作用

如果我使用类似 NHibernate 的 ORM,为啥需要 LINQ?

NHibernate - 使用 LINQ 选择随机记录数

NHibernate 与 LINQ(谓词?)