Freigeben über


Funktionsweise von Abfragen

Entity Framework Core verwendet LINQ (Language Integrated Query), um Daten aus der Datenbank abzufragen. LINQ ermöglicht es Ihnen, C# (oder Ihre .NET-Sprache der Wahl) zu verwenden, um stark typierte Abfragen basierend auf Ihren abgeleiteten Kontext- und Entitätsklassen zu schreiben.

Hinweis

Dieser Artikel ist veraltet, und einige Teile davon müssen aktualisiert werden, um Änderungen im Entwurf der Abfragepipeline zu berücksichtigen. Wenn Sie Zweifel an einem hier erwähnten Verhalten haben, stellen Sie bitte eine Frage.

Die Lebensdauer einer Abfrage

Die folgende Beschreibung ist eine allgemeine Übersicht über den Prozess, den jede Abfrage durchläuft.

  1. Die LINQ-Abfrage wird von Entity Framework Core verarbeitet, um eine Darstellung zu erstellen, die vom Datenbankanbieter verarbeitet werden kann.
    1. Das Ergebnis wird zwischengespeichert, damit diese Verarbeitung nicht jedes Mal ausgeführt werden muss, wenn die Abfrage ausgeführt wird.
  2. Das Ergebnis wird an den Datenbankanbieter übergeben.
    1. Der Datenbankanbieter identifiziert, welche Teile der Abfrage in der Datenbank ausgewertet werden können.
    2. Diese Teile der Abfrage werden in datenbankspezifische Abfragesprache übersetzt (z. B. SQL für eine relationale Datenbank)
    3. Eine Abfrage wird an die Datenbank gesendet, und das Resultset wird zurückgegeben. Die Ergebnisse sind Werte aus der Datenbank, nicht Entitätsinstanzen.
  3. Für jedes Element in der Ergebnismenge
    1. Wenn es sich bei der Abfrage um eine Nachverfolgungsabfrage handelt, überprüft EF, ob die Daten bereits im Änderungstracker für die Kontextinstanz eine Entität darstellen.
      • Wenn ja, wird die vorhandene Entität zurückgegeben.
      • Andernfalls wird eine neue Entität erstellt, die Änderungsnachverfolgung wird eingerichtet, und die neue Entität wird zurückgegeben.
    2. Wenn es sich bei der Abfrage um eine No-Tracking-Abfrage handelt, wird immer eine neue Entität erstellt und zurückgegeben.

Wann Abfragen ausgeführt werden

Wenn Sie LINQ-Operatoren aufrufen, erstellen Sie einfach eine Speicherdarstellung der Abfrage. Die Abfrage wird nur an die Datenbank gesendet, wenn die Ergebnisse abgerufen werden.

Die häufigsten Vorgänge, die dazu führen, dass die Abfrage an die Datenbank gesendet wird, sind:

  • Durchlaufen der Ergebnisse in einer for Schleife
  • Verwendung eines Operators wie ToList, ToArray, Single, Count oder die entsprechenden asynchronen Überladungen

Warnung

Benutzereingaben immer überprüfen: Während EF Core vor SQL-Einfügungsangriffen schützt, indem Parameter verwendet und Literale in Abfragen maskiert werden, werden Eingaben nicht überprüft. Die geeignete Überprüfung sollte gemäß den Anforderungen der Anwendung ausgeführt werden, bevor Werte aus nicht vertrauenswürdigen Quellen in LINQ-Abfragen verwendet, Entitätseigenschaften zugewiesen oder an andere EF Core-APIs übergeben werden. Dies schließt alle Benutzereingaben ein, die zum dynamischen Erstellen von Abfragen verwendet werden. Auch wenn Sie LINQ verwenden, müssen Sie sicherstellen, dass nur beabsichtigte Ausdrücke erstellt werden können, wenn Sie Benutzereingaben zum Erstellen von Ausdrücken akzeptieren.