web-dev-qa-db-fra.com

Comment choisir où ne pas exister en utilisant LINQ?

Je dois lister toutes les données " shift " à attribuer à un " employé "mais les données d'équipe ne doivent pas être incluses si elles existent déjà dans les données de l'employé. Voyons l'exemple d'image.

No filtering yet

Cette requête résout le problème. J'ai trouvé ça ici:
Scott's Blog

select * from shift where not exists 
(select 1 from employeeshift where shift.shiftid = employeeshift.shiftid
and employeeshift.empid = 57);  

Voyons le résultat:

Filtered

Maintenant ma question est, comment pourrais-je faire ceci dans linQ? J'utilise un cadre d'entité.
J'espère que quelqu'un pourra vous aider. Merci beaucoup!!!

47
fiberOptics
from s in context.shift
where !context.employeeshift.Any(es=>(es.shiftid==s.shiftid)&&(es.empid==57))
select s;

J'espère que cela t'aides

83
Arsen Mkrtchyan

Le résultat SQL sera différent mais le résultat devrait être le même:

var shifts = Shifts.Where(s => !EmployeeShifts.Where(es => es.ShiftID == s.ShiftID).Any());
23
hyp

Tout d'abord, je suggère de modifier un peu votre requête SQL:

 select * from shift 
 where shift.shiftid not in (select employeeshift.shiftid from employeeshift 
                             where employeeshift.empid = 57);

Cette requête fournit les mêmes fonctionnalités. Si vous voulez obtenir le même résultat avec LINQ, vous pouvez essayer ce code:

//Variable dc has DataContext type here
//Here we get list of ShiftIDs from employeeshift table
List<int> empShiftIds = dc.employeeshift.Where(p => p.EmpID = 57).Select(s => s.ShiftID).ToList();

//Here we get the list of our shifts
List<shift> shifts = dc.shift.Where(p => !empShiftIds.Contains(p.ShiftId)).ToList();
2
Ceridan