NHibernate QueryOver 两次加入一个集合

Posted

技术标签:

【中文标题】NHibernate QueryOver 两次加入一个集合【英文标题】:NHibernate QueryOver joining to a collection twice 【发布时间】:2011-12-06 16:32:35 【问题描述】:

我正在使用这个 QueryOver 编写一个可排序网格的查询:

IQueryOver<Order, Order> query = session.QueryOver(() => _OrderAlias); 
query.Left.JoinQueryOver(() => _OrderAlias.Employees, () => _OrderEmployeeAssigneeAlias,
      () => _OrderEmployeeAssigneeAlias.OrderEmployeeType == OrderEmployeeType.Assignee); 
query.Left.JoinQueryOver(() => _OrderAlias.Employees, () => _OrderEmployeeSalespersonAlias, 
      () => _OrderEmployeeSalespersonAlias.OrderEmployeeType == OrderEmployeeType.SalesPerson); 
query.OrderBy(() => _OrderEmployeeSalespersonAlias.LastName).Desc; 

有条件地,查询将按受让人排序,而不是按 销售人员,所以这就是多个连接到同一个的原因 桌子。

运行这个查询会产生这个异常:

NHibernate.QueryException: duplicate association path: Employees ---> 
System.ArgumentException: An item with the same key has already been 
added. 
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue 
value, Boolean add) 
   at NHibernate.Util.LinkedHashMap`2.Add(TKey key, TValue value) 
   at 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.CreateAssociationPathCri teriaMap()

我看过有关使用 HQL 执行此操作的帖子,还有一些这样说 Criteria API 目前不支持。

这是正确的吗? HQL 是两次加入集合的唯一方法吗?

我可以使用 QueryOver 做到这一点吗? (另外,有没有更好的方法 这比使用两个连接?)

提前致谢。

【问题讨论】:

您好,我在其他帖子中发布了我的回答同样的问题,如果您还有问题可以查看link 【参考方案1】:

是的,这是我之前遇到的限制。

我最近遇到了类似的问题,想坚持使用 QueryOver 和使用 Transformer 进行自定义投影。我能够通过执行 LEFT OUTER JOIN 来解决,在外部表上使用 case..then..else 表达式,然后 GROUP BY 将结果合并回所需的单行以转换为 DTO。但是,我认为这种方法仅在您使用 DTO 时才有用。

【讨论】:

以上是关于NHibernate QueryOver 两次加入一个集合的主要内容,如果未能解决你的问题,请参考以下文章

使用 queryover 加入 2 个表

NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询

如何在 Nhibernate 中对子集合进行 QueryOver

NHibernate 3.0:没有使用QueryOver的FirstOrDefault()?

使用 NHibernate 3.0 QueryOver 或 LINQ 提供程序的权衡

NHibernate 使用带有 WHERE IN 的 QueryOver