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