2011-12-06 108 views
2

我用這QueryOver編寫查詢的排序網格:NHibernate的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做這個職位,而不是目前的標準API所支持的少數說這 。

這是正確的嗎? HQL是加入收藏兩次的唯一方式嗎?

我可以使用QueryOver做到這一點嗎? (另外,有沒有更好的方法來做 比使用兩個連接?)

在此先感謝。

+0

您好, 我貼我的其他線程有同樣的問題answear你可以去看看,如果你仍然有這個問題 [鏈接](http://stackoverflow.com/questions/8118863/nhibernate-multiple-join -to最相同表按不同的密鑰/ 10104467#10104467) – Mariusz

回答

0

是的這是我以前遇到的限制。

我最近有類似的問題,並希望堅持使用QueryOver和自定義投影與變壓器。我可以通過執行LEFT OUTER JOIN來解決問題,使用case..then..else表達式在外部表上,然後GROUP BY將結果合併回所需的單個行以轉換爲DTO。但是,我認爲這種方法只有在您使用DTO時纔有用。