Linq содержит проблему: не может сформулировать эквивалент запроса «WHERE IN» - PullRequest
0 голосов
/ 07 июля 2011

В таблице ReservationWorkerPeriods есть записи всех работников, которые планируют работать в определенный период на любой возможной машине.

Дополнительная таблица WorkerOnMachineOnConstructionSite содержит столбцы workerId, MachineId и ConstructionSiteId.

Из таблицы ReservationWorkerPeriods я хотел бы получить только работников, которые работают на выбранной машине.

Чтобы извлечь только соответствующие записи из таблицы WorkerOnMachineOnConstructionSite, я написал следующий код:

var relevantWorkerOnMachineOnConstructionSite = (from cswm in currentConstructionSiteSchedule.ContrustionSiteWorkerOnMachine
                                                        where cswm.MachineId == machineId
                                                        select cswm).ToList();
        workerOnMachineOnConstructionSite = relevantWorkerOnMachineOnConstructionSite as List<ContrustionSiteWorkerOnMachine>;

Эти записи также используются в приложении, поэтому я не хочу обходить вышеуказанный код, даже если возможно напрямую получить только workerPeriods для работников, которые работают на выбранной машине. Во всяком случае, я не выяснил, как можно получить соответствующие значения workerPeriods, когда мы узнаем, какие идентификаторы user релевантны.

Я попробовал следующий код:

var userIDs = from w in workerOnMachineOnConstructionSite select new {w.WorkerId};

        List<ReservationWorkerPeriods> workerPeriods = currentConstructionSiteSchedule.ReservationWorkerPeriods.ToList();
        allocatedWorkers = workerPeriods.Where(wp => userIDs.Contains(wp.WorkerId));

но он кажется неправильным и не знает, как это исправить. Кто-нибудь знает, в чем проблема и как можно получить из списка только записи, содержащие идентификаторы пользователей?

1 Ответ

2 голосов
/ 07 июля 2011

В настоящее время вы создаете анонимный объект на лету с одним свойством. Вы можете получить идентификатор напрямую с помощью (обратите внимание на отсутствующие фигурные скобки):

var userIDs = from w in workerOnMachineOnConstructionSite select w.WorkerId;

Кроме того, в таких случаях не вызывайте ToList для него - переменная userIDs просто содержит запрос, а не результат. Если вы используете эту переменную в следующем запросе, поставщик может преобразовать ее в один SQL-запрос.

...