Skip to main content
 首页 » 编程设计

c#之NHibernate QueryOver 两次加入一个集合

2024年01月11日29zhwl

我正在使用此 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;  

有条件地,查询将构建为按受让人排序,而不是按 销售人员,所以这是多个加入相同的原因 table 。

运行此查询会产生此异常:

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 来做到这一点吗? (还有,有没有更好的办法 这比使用两个连接?)

提前致谢。

请您参考如下方法:

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

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