NHibernate QueryOver присоединяется к коллекции дважды - PullRequest
2 голосов
/ 06 декабря 2011

Я пишу запрос для сортируемой сетки с использованием этого 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; 

Условно, запрос будет построен для сортировки по Assignee, а не по Salesperson, поэтому это является причиной нескольких объединенийк той же таблице.

Выполнение этого запроса приводит к следующему исключению:

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?(Кроме того, есть ли лучший способ сделать это, чем использование двух объединений?)

Заранее спасибо.

1 Ответ

0 голосов
/ 07 декабря 2011

Да, это ограничение, которое я уже применял.

У меня недавно была похожая проблема, и я хотел использовать QueryOver и пользовательскую проекцию с помощью Transformer. Я смог решить, выполнив LEFT OUTER JOIN, используя выражения case..then..else для внешней таблицы, а затем GROUP BY, чтобы объединить результаты обратно в нужную единственную строку для преобразования в DTO. Тем не менее, я думаю, что этот подход полезен, только если вы работаете с DTO.

...