我正在使用此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吗? (还有,有没有更好的方法
这比使用两个联接好吗?)

提前致谢。

最佳答案

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

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

关于c# - NHibernate QueryOver两次加入集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8403389/

10-12 18:08