2012-01-27 13 views
40

Muszę podać wszystkie dane "przesunięcie", które zostaną przypisane do "pracownika", ale dane przesunięcia nie mogą być uwzględnione, jeśli są już zawarte w danych pracownika. Zobaczmy próbkę obrazu.Jak wybrać, GDZIE NIE ISTNIEJE, używając LINQ?

No filtering yet

Zapytanie to rozwiązuje problem. Znalazłem to tutaj:
Scott's Blog

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

Zobaczmy Rezultat:

Filtered

Teraz moje pytanie jest, w jaki sposób mogę zrobić to w LINQ? Używam framework entity.
Mam nadzieję, że ktoś może pomóc. Wielkie dzięki!!!

+1

mogłeś po prostu zrobić sprzężenie ... jeśli prawo rekord nie istnieje, lewicowo-zapis powinien nie musi być zawarty –

+0

@AndreasNiedermair Czy możesz zrobić przykład? Dużo się przyłączyłem, ale nie dostałem właściwego. – fiberOptics

+0

możliwy duplikat [LINQ - gdzie nie istnieje] (http://stackoverflow.com/questions/899090/linq-where-not-exists) –

Odpowiedz

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

Nadzieja to pomaga

+0

oops, tak, naprawione, dzięki @RuneFS –

+0

"&& es.empid = 57" musi być w środku "(es.shiftid == s.shiftid)". działa, ale nie zwraca kompletnych danych, brakuje niektórych danych. – fiberOptics

21

Wynik sql będzie inny, ale wynik powinien być taki sam:

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

Powinieneś zawsze używać 'Any()' zamiast 'Count()' aby określić, czy wyniki są ... – Nuffin

+4

powinieneś użyj!. Any() zamiast liczyć. Jeśli ich nie ma, wydajność będzie taka sama, ale we wszystkich przypadkach, w których "więcej niż 1 element" będzie szybszy, ponieważ zatrzymuje on iterację po znalezieniu pierwszego elementu. –

+0

Wystarczająco sprawiedliwe, edytowane. – hyp

0

Jak o ..

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

edit: to będzie daje ci zmiany tam, gdzie jest powiązana zmiana personalna (z powodu dołączenia). Dla „nie istnieje” Chciałbym zrobić co @ArsenMkrt lub @hyp sugerują

+0

Tracisz empid = 57 sprawdzanie –

+0

Yup, a także zdałem sobie sprawę, że nie jestem actaully odpowiedzi na właściwe pytanie! –

+0

tak, ponieważ wynik powinien być ustawiony na wynik, otrzymujesz wartość boolową –

2

Przede wszystkim radzę trochę zmodyfikować zapytanie SQL:

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

To zapytanie zapewnia taką samą funkcjonalność. Jeśli chcesz uzyskać ten sam rezultat z LINQ, można spróbować tego kodu:

//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(); 
+0

Kwerenda sql działa idealnie. Ale w Linq mam się dobrze z pojedynczym zapytaniem. Dzięki! – fiberOptics

-1
 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

Proszę wyjaśnić, co robisz z tym kodem. –

Powiązane problemy