2011-07-06 1 views
0

Dans la table ReservationWorkerPeriods, il existe des enregistrements de tous les travailleurs qui sont planifiés pour travailler sur une période donnée sur n'importe quelle machine.Linq Contient problème: impossible de formuler l'équivalent de la requête 'WHERE IN'

La table supplémentaire WorkerOnMachineOnConstructionSite contient les colonnes workerId, MachineId et ConstructionSiteId.

Depuis la table ReservationWorkerPeriods Je souhaite récupérer uniquement les travailleurs qui travaillent sur la machine sélectionnée.

Pour récupérer uniquement les documents pertinents de la table WorkerOnMachineOnConstructionSite j'ai écrit le code suivant:

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

Ces documents sont également utilisés dans l'application, donc je ne veux pas contourner le code ci-dessus, même si est possible de récupérer directement juste workerPeriods pour les travailleurs qui travaillent sur la machine sélectionnée. Quoi qu'il en soit, je n'ai pas compris comment il est possible de récupérer les workersPeriod pertinents une fois que nous savons quels userIDs sont pertinents.

J'ai essayé le code suivant:

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

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

mais il semble être incorrect et ne savent pas comment y remédier. Est-ce que quelqu'un sait quel est le problème et comment il est possible de récupérer seulement les enregistrements qui contiennent des ID utilisateur de la liste?

Répondre

2

Actuellement, vous construisez un objet anonyme à la volée, avec une propriété. Vous aurez envie de saisir l'identifiant directement avec (notez les accolades manquantes):

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

En outre, dans ce cas, ne pas appeler ToList sur elle - la userIDs variable contient simplement la requête, et non pas le résultat . Si vous utilisez cette variable dans une autre requête, le fournisseur peut la traduire en une seule requête SQL.