Suche…


Übersetzen einer LINQ-Abfrage in eine SQL-Abfrage

Mit den Schnittstellen IQueryable und IQueryable<T> können Entwickler eine LINQ-Abfrage (eine sprachintegrierte Abfrage) in eine bestimmte Datenquelle, z. B. eine relationale Datenbank, übersetzen. Nehmen Sie diese in C # geschriebene LINQ-Abfrage:

var query = from book in books
            where book.Author == "Stephen King" 
            select book;

Wenn die Variable books ein Typ ist, der IQueryable<Book> implementiert, wird die IQueryable<Book> Abfrage in Form eines Ausdrucksbaums an den Anbieter übergeben (in der Eigenschaft IQueryable.Provider ). IQueryable.Provider ist eine Datenstruktur, die die Struktur des Codes widerspiegelt .

Der Provider kann zur Laufzeit den Ausdrucksbaum überprüfen, um Folgendes zu ermitteln:

  • dass es ein Prädikat für die Author Eigenschaft der Book Klasse gibt;
  • dass die verwendete Vergleichsmethode gleich ist ( == );
  • dass der Wert, den es gleich sein sollte, "Stephen King" .

Mit diesen Informationen kann der Anbieter die C # -Anfrage zur Laufzeit in eine SQL-Abfrage konvertieren und diese Abfrage an eine relationale Datenbank übergeben, um nur die Bücher abzurufen, die dem Prädikat entsprechen:

select *
from Books
where Author = 'Stephen King'

Der Provider aufgerufen wird , wenn die query Variable iteriert ( IQueryable implementiert IEnumerable ).

(Der in diesem Beispiel verwendete Provider würde einige zusätzliche Metadaten erfordern, um zu wissen, welche Tabelle abgefragt werden soll, und um zu erfahren, wie die Eigenschaften der C # -Klasse mit den Tabellenspalten IQueryable werden. IQueryable Metadaten liegen jedoch außerhalb des Bereichs der IQueryable Schnittstelle.)



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow