Domanda Come selezionare DOVE NON ESISTE usando LINQ?


Devo elencare tutto "cambio"dati da assegnare a un"dipendente"ma i dati di turno non devono essere inclusi se sono già presenti nei dati dei dipendenti. Vediamo l'esempio dell'immagine.

No filtering yet

Questa query risolve il problema. Ho trovato questo qui:
Il blog di Scott 

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

Vediamo il risultato:

Filtered 

Ora la mia domanda è, come potrei fare questo in linQ? Sto usando il framework di entità.
Spero che qualcuno possa aiutare. Molte grazie!!!


41
2018-01-27 09:07


origine


risposte:


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

Spero che questo ti aiuti


74
2018-01-27 09:12



Il risultato sql sarà diverso ma il risultato dovrebbe essere lo stesso:

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

21
2018-01-27 09:12



Prima di tutto, ti suggerisco di modificare un po 'la tua query sql:

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

Questa query fornisce la stessa funzionalità. Se vuoi ottenere lo stesso risultato con LINQ, puoi provare questo codice:

//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
2018-01-27 09:23



Che ne dite di..

var result = (from s in context.Shift join es in employeeshift on s.shiftid equals es.shiftid where es.empid == 57 select s)

Modifica: questo ti fornirà i turni in cui è presente un employeeshift associato (a causa del join). Per il "non esiste" farei ciò che @ArsenMkrt o @hyp suggeriscono


-1
2018-01-27 09:13



        Dim result2 = From s In mySession.Query(Of CSucursal)()
                      Where (From c In mySession.Query(Of CCiudad)()
                             From cs In mySession.Query(Of CCiudadSucursal)()
                             Where cs.id_ciudad Is c
                             Where cs.id_sucursal Is s
                             Where c.id = IdCiudad
                             Where s.accion <> "E" AndAlso s.accion <> Nothing
                             Where cs.accion <> "E" AndAlso cs.accion <> Nothing
                             Select c.descripcion).Single() Is Nothing
                      Where s.accion <> "E" AndAlso s.accion <> Nothing
                      Select s.id, s.Descripcion

-1
2017-07-15 22:56