NHibernate 3.1 Linq с содержит и любой - PullRequest
8 голосов
/ 17 мая 2011

Мы находимся в процессе обновления до NH3.1, который идет хорошо - все работает, насколько мы можем судить по существующему коду.Одним из мотивов перехода на NH3 из 2 является использование поддержки Linq, и в целом она работает очень хорошо.Однако я борюсь с некоторыми более сложными предложениями where, особенно когда я хочу проверить на основе подколлекции:

var results = from r in registrations 
              where ( 
                         from p in persons 
                         where p.ExplicitManagers.Any(m => m.Manager == manager) 
                         select p 
                     ).Contains(r.Registrant) 
              select r; 

, где модель:
p - это Person иregistration r имеет регистранта типа Person
p содержит коллекцию ExplicitManager ассоциативных сущностей, которые содержат ссылку на другого Person (менеджер).

примечание: регистрации - это IQueryable<Registration>.Query() и лица в IQueryable<Person>.Query().
По сути, я пытаюсь ограничить регистрации тем, где person1 является явным менеджером p.Я могу сделать это через соединения, но не через подзапрос Contains.

Я получаю следующую ошибку:

"System.InvalidOperationException: Sequence содержит более одного совпадающего элемента"

причина сделать это какПодзапрос вызван тем, что в конечном итоге мне нужно вывести логику для проверки менеджеров, чтобы сделать ее многократно используемой (на самом деле она более сложная, но я упростила ее для этого примера, потому что это Any внутри Contains, которая вызываетгоре).

Contains, кажется, работает нормально, когда нет подзапроса с Any.Это то, что я делаю неправильно, или это что-то неподдерживаемое или ошибка, и есть ли другой способ добиться того же?

Большое спасибо за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

8 голосов
/ 18 мая 2011

Хотя Contains не работает должным образом, использование Any делает:

var results = from r in registrations 
              where ( 
                         from p in persons 
                         where p.ExplicitManagers.Any(m => m.Manager == manager) 
                         select p 
                     ).Any(p=>p == r.Registrant) 
              select r; 
1 голос
/ 17 мая 2011

Можете ли вы выполнить подзапрос самостоятельно без проблем?

var result = from p in persons 
where p.ExplicitManagers.Any(m => m.Manager == manager) 
select p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...