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 两次加入一个集合的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询
如何在 Nhibernate 中对子集合进行 QueryOver
NHibernate 3.0:没有使用QueryOver的FirstOrDefault()?