лямбда-выражение пытается запросить один список на основе другого - PullRequest
0 голосов
/ 23 декабря 2010

После некоторого совета о том, как сделать это красиво, используя лямбда-выражения.

Я хочу получить список мест размещения на основе агентства.Я хочу, чтобы места размещения были в том месте, где Place.agency! = Агентство, но где Place.agencypersonnel содержит какой-либо из сотрудников агентства.

Так что, если место размещения не для этого агентства, но есть сотрудники этого агентства, вовлеченные в другое агентстворазмещение агентства

Я не знаю, как запросить на основе второго условия.

Так что-то вроде:

// agency is being passed in
     var agencySupervisors = agency.AgencyPersonnel;

     return agency.Placements
            .Where(p => p.Supervisors.Contains(agencySupervisors))
            .Where(p => p.Agency != agency);

Я получаю, что Contains должен ссылаться наотдельный объект, а не коллекция - вот почему он ошибается ... но я не уверен, как заставить его проверять все объекты в коллекции.

Также пробовал Любой

 return agency.Placements
           .Where(p => agencySupervisors.Any<PlacementSupervisor>(p.Supervisors))
           .Where(p => p.Agency != agency);

Так что, надеюсь, просто я использую не тот!

Другой гаечный ключ в работах пытается выяснить, как руководитель размещения и сотрудники агентства связаны друг с другом. Я думаю, что это связано с AgencyPersonnelId = SupervisorId, поэтому я предполагаю, что это также должно бытьв мое выражение.

Спасибо!

Редактировать: Как мне обрабатывать, если типы объектов в списке не совпадают - но я знаю, что идентификатор будетматч.Должен ли я написать компаратор и каким-то образом включить это в выражение?то есть.AgencyPersonnelId = SupervisorId

Я пытался:

return placements
                .Where(p => p.Supervisors.Any(supervisor => agencySupervisors.Any(ap => ap.AgencyPersonnelId == supervisor.SupervisorId)));

Но это не дает мне никаких результатов, поэтому это явно неправильно.

Редактировать: На самом делекогда я пытаюсь перебрать места размещения в возвращенной коллекции, я получаю исключение нулевой ссылки - поэтому я не уверен, связано ли это с моим выражением или с тем, как я возвращаю результаты.

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

Вы близки с Any & Contains - попробуйте оба сразу

return agency.Placements        
    .Where(p => agencySupervisors.Any(supervisor => p.Supervisors.Contains(supervisor))
    .Where(p => p.Agency != agency);
0 голосов
/ 24 декабря 2010

Спасибо всем за помощь - поскольку объекты были разных типов, мне пришлось сделать что-то немного другое - но потом я обнаружил, что могу использовать их идентификаторы для сравнения, поэтому результат был:*

Плюс, как правильно заметил Микаэль, я начал с неправильной коллекции, во-первых :)

0 голосов
/ 23 декабря 2010

Я думаю, что вы можете сделать это с .Intersect также:

return agency.Placements
         .Where(p => agencySupervisors.Intersect(p.Supervisors).Any()
                     && p.Agency != agency); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...