我正在使用此 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 时才有用。
