2014-06-10 12 views
5

Przepraszam za mój angielski, postaram się być krótkie i zwięzłe.NOT EXISTS użyciu LINQ

muszę tabelach "alumnos" i "MATERIAS". W SQL istnieje inna tabela "ALUMNOS BY MATERIAS". Wiem, że nie jest to konieczne w EF, ponieważ istnieje nawigacja właściwości, ale muszę uzyskać ALUMNOS, które nie zostały zarejestrowane w żadnych MATERIASACH.

chcę coś takiego:

SELECT * 
    FROM ALUMNOS AS A 
    WHERE NOT EXISTS(
       SELECT MA.MATERIAID 
       FROM MATERIASXALUMNO AS MA 
       WHERE A.LEGAJO = MA.LEGAJO 
        AND .MATERIAID = XXX) 

Ale mój zamieszanie zaczyna ponieważ w jednostkach alumnos Mam Kolekcja Materias i odwrotnie, ale nie mam w alumnos MateriaID lub w Materias AlumnosID więc jak mogę zrób to z linq ??

Podsumowując, co potrzebne jest uzyskać alumnos, które nie są zapisane w XX Materia i alumnos że są zapisani w tym Materia ...

z góry dzięki, mam nadzieję, że może mi pomóc, I to naprawić za pomocą procedur przechowywanych, ale chcę go z Linq lub przynajmniej zrozumieć, jak to się robi ...

Pozdrowienia z Argentyny! Guille

+0

Prześlij swój schemat jednostek, ciężko zrozumieć, co masz na myśli na podstawie Twojego opisu. – Pantelis

Odpowiedz

8

Myślę, że chcesz coś podobnego

var missing = dbcontext.Alumnos.Where(a => !a.Materias.Any(m => m.MateriaID == XXX)); 

który uzyskuje dostęp do kolekcji Materias w alumnos bez martwienia się o stół przyłączyć. (Przy założeniu, że właściwości nawigacji są poprawnie odwzorowane.)

+0

Doskonały !!! Tego właśnie potrzebowałem ... Dziękuję wszystkim !! – Guille

3

Zastosowanie .Any() dla Exists i można odwrócić go za pomocą !Any()

//assuming that ALUMNOS and MATERIASXALUMNO have FK A.LEGAJO = MA.LEGAJO 
from a in context.Alumnos 
where !a.MATERIASXALUMNO.Where(ma=>ma.MATERIAID == XXX).Any() 
select a 

A jeśli nie to

from a in context.Alumnos 
where !context.MATERIASXALUMNO.Where(ma=>ma.MATERIAID == XXX && a.LEGAJO == ma.LEGAJO) 
           .Any() 
select a 

Używam Where(predicate) i Any() tylko zachować to jasne, ale można scalić i po prostu użyć Any(predicate of where) również, jak pokazano w drugim poście

+1

Gwarantuję ci, że używając '.! Any()' (jak w 'Foo. ! Any() ') nie skompilowałoby się. –

+0

Powiedzieli, że mają właściwości nawigacyjne; wygląda na to, że mają kontekst.MATERIASXALUMNO? – MysteriousWhisper

+1

'Any' również pobiera predykat dokładnie tak, jak" Gdzie ". Możesz więc przekazać predykat bezpośrednio do 'Any' i usunąć' Where'. – Default

1

Twój coś wyglądające jak:

var existing = (from alumno in datacontext.Alumnos 
       where datacontext.Materias.Any(m => m.AlumnoID == alumno.AlumnoID) 
       select alumno); 

i

var missing = (from alumno in datacontext.Alumnos 
       where !datacontext.Materias.Any(m => m.AlumnoID == alumno.AlumnoID) 
       select alumno); 
+0

starałem się to zrobić, ale kiedy robię „... datacontext.Materias.Any (m => m.AlumnoID ...” Ja nie AlumnoID Mam EntityCollection z alumnos ... to moja dezorientacja ... – Guille

+0

Nie określasz, która jest tabelą nadrzędną. Opublikuj klasy jednostek, jeśli używasz schematu pierwszego lub schematu bazy danych w inny sposób, aby lepiej zrozumieć, co próbujesz zrobić: – Pantelis