2017-10-23 1 views
0

Ich habe vor kurzem Entity Framework verwendet. Für elementare CRUD-Operationen habe ich keine Probleme, aber für kompliziertere Abfragen weiß ich nicht, wie man diese durchführt.SQL "nicht in" -Syntax und geschachtelte SELECT in Entity Framework

Zum Beispiel: Wie schreibe ich eine geschachtelte Auswahl? Wie benutzt man den Operator NOT IN?

Die Abfrage, die ich schreiben möchte ist:

SELECT * 
FROM course 
WHERE idCourse NOT IN (SELECT idCourse 
         FROM reservation 
         WHERE idStudent = 'value'); 

Ich weiß nicht, wo ich anfangen soll. Könnten Sie mir bitte einen Rat geben?

+0

werden Sie einen Fehler erhalten? –

+0

Ich würde dieses Tutorial für alles über 'EntityFramework' empfehlen: http://www.entityframeworktutorial.net/Query-with-EDM.aspx. –

Antwort

1

Wenn ich Ihre Frage nicht missverstehen, möchten Sie wissen, wie Sie die Frage der Frage als LINQ-to-Entity Anfrage schreiben.

Beispiele könnten sein:

var courses = context.Courses 
    .Where(c => c.Reservations.All(r => r.idStudent != "value")) 
    .Select(c => c); 

// with eager loading 
var courses = (from c in context.Courses.Include(c => c.Reservations) 
       where c.Reservations.All(r => r.idStudent != "value") 
       select c).ToArray(); 

var courses = (from c in context.Courses 
       join r in context.Reservations on c.idCourse equals r.idCourse 
       where r => r.idStudent != "value" 
       select c).ToArray(); 

Die Contains() ist EXIST IN in einer Abfrage gleichwertig. Nun, 1. und 2. fast gleich. Einziger Unterschied ist die Include Methode, um zu zeigen, wie Sie eifrig laden konnten Daten. In der dritten Abfrage verwende ich das Join-Schlüsselwort, um eine Join-Operation durchzuführen - das entspricht einer INNER JOIN. Das Ergebnis enthält nur Datensätze, bei denen eine Beziehung zwischen einem Kurs und einer Reservierung besteht und auf die gesuchte Studenten-ID in der Reservierung verwiesen wird.

Wenn Sie LINQ nicht für Ihre Abfragen verwenden sollten, sollten Sie einen Blick darauf werfen. Dies ist eine perfekte Methode, um Ihre Datenzugriffsebene von der Persistenzschicht zu trennen, und Sie können alle Abfragen auch im Code testen.

Here konnten Sie einen sehr guten Einstieg in das Thema bekommen.

EDIT: Modifizierter Beispielcode passend zu NOT IN.

+0

Vorsichtig, OP fragte nach "NOT IN". Ihr Code wird "Kurse" zurückgeben, wenn eine "Reservierung" den "idstudent" "Wert" enthält, was der Frage widerspricht. Entfernt den Downvote, wenn die Änderung vorgenommen wird. –

+0

Ah, danke für den Hinweis. Ich werde meine Antwort ändern. – ChW

+0

Vielen Dank für die Änderungen, für tolle Erklärungen upvoted –

0

Wenn Sie Probleme bei der Ausführung komplexer Abfragen mit LINQ haben, können Sie auch Raw-SQL-Abfragen ausführen. Sie sind einfach und schneller als LINQ-Abfragen. Hier

ist ein Beispiel in C#

var list = dc.Database.SqlQuery<YourCourceClass>(@"SELECT * 
FROM course 
WHERE idCourse NOT IN(SELECT idCourse 
         FROM reservation 
         WHERE idStudent = 'value');").ToList();