Funktionsweise von AbfragenHow Queries Work

Entity Framework Core verwendet Language Integrate Query (LINQ), um Daten von der Datenbank abzufragen.Entity Framework Core uses Language Integrate Query (LINQ) to query data from the database. LINQ ermöglicht Ihnen, mit C# (oder Ihrer bevorzugten .NET-Sprache) stark typisierte Abfragen basierend auf Ihrem abgeleiteten Kontext und Entitätsklassen zu schreiben.LINQ allows you to use C# (or your .NET language of choice) to write strongly typed queries based on your derived context and entity classes.

Der AbfragezyklusThe life of a query

Nachstehend finden Sie eine grobe Übersicht über die verschiedenen Phasen des Abfragevorgangs.The following is a high level overview of the process each query goes through.

  1. Die LINQ-Abfrage wird von Entity Framework Core verarbeitet. Dabei wird eine Darstellung erstellt, die wiederum vom Datenbankanbieter verarbeitet wird.The LINQ query is processed by Entity Framework Core to build a representation that is ready to be processed by the database provider
    1. Das Ergebnis wird zwischengespeichert, damit dieser Vorgang nicht jedes Mal ausgeführt werden muss, wenn die Abfrage ausgeführt wird.The result is cached so that this processing does not need to be done every time the query is executed
  2. Das Ergebnis wird an den Datenbankanbieter übergeben.The result is passed to the database provider
    1. Der Datenbankanbieter ermittelt, welche Teile der Abfrage in der Datenbank ausgewertet werden können.The database provider identifies which parts of the query can be evaluated in the database
    2. Diese Teile der Abfrage werden in die datenbankspezifische Abfragesprache übersetzt, z.B. SQL für relationale Datenbanken.These parts of the query are translated to database specific query language (e.g. SQL for a relational database)
    3. Mindestens eine Abfrage wird an die Datenbank gesendet, und das Resultset wird zurückgegeben (Ergebnisse sind Datenbankwerte, keine Entitätsinstanzen).One or more queries are sent to the database and the result set returned (results are values from the database, not entity instances)
  3. Für jedes Element im Resultset wird Folgendes ausgeführt:For each item in the result set
    1. Wenn es sich um eine Überwachungsabfrage handelt, überprüft EF, ob die Daten eine Entität darstellen, die bereits in der Änderungsnachverfolgung für die Kontextinstanz vorhanden ist.If this is a tracking query, EF checks if the data represents an entity already in the change tracker for the context instance
      • Wenn dies der Fall ist, wird die vorhandene Entität zurückgegeben.If so, the existing entity is returned
      • Wenn dies nicht der Fall ist, wird eine neue Entität erstellt, die Änderungsnachverfolgung wird eingerichtet, und die neue Entität wird zurückgegeben.If not, a new entity is created, change tracking is setup, and the new entity is returned
    2. Wenn dies keine Überwachungsabfrage ist, überprüft EF, ob die Daten eine Entität darstellen, die bereits im Resultset der Abfrage vorhanden ist.If this is a no-tracking query, EF checks if the data represents an entity already in the result set for this query
      • Wenn dies der Fall ist, wird die vorhandene Entität zurückgegeben.(1)If so, the existing entity is returned (1)
      • Wenn dies nicht der Fall ist, wird eine neue Entität erstellt und zurückgegeben.If not, a new entity is created and returned

(1) Abfragen, die keine Überwachungsabfragen sind, verwenden schwache Verweise, um Entitäten nachzuverfolgen, die bereits zurückgegeben wurden.(1) No tracking queries use weak references to keep track of entities that have already been returned. Wenn ein vorheriges Ergebnis mit derselben Identität den gültigen Bereich verlässt und die Garbage Collection ausgeführt wird, können Sie eine neue Entitätsinstanz abrufen.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance.

Ausführen von AbfragenWhen queries are executed

Wenn Sie LINQ-Operatoren aufrufen, erstellen Sie einfach eine speicherinterne Darstellung der Abfrage.When you call LINQ operators, you are simply building up an in-memory representation of the query. Die Abfrage wird nur an die Datenbank gesendet, wenn die Ergebnisse verarbeitet werden.The query is only sent to the database when the results are consumed.

Dies sind die üblichsten Vorgänge, aufgrund derer die Abfrage wird an die Datenbank gesendet wird:The most common operations that result in the query being sent to the database are:

  • Durchlaufen die Ergebnisse in einer for-SchleifeIterating the results in a for loop
  • Verwenden eines Operators wie ToList, ToArray, Single oder CountUsing an operator such as ToList, ToArray, Single, Count
  • Datenbindung der Ergebnisse einer Abfrage an eine BenutzeroberflächeDatabinding the results of a query to a UI

Warnung

Benutzereingaben immer überprüfen: EF bietet zwar Schutz vor Angriffen durch Einschleusung von SQL-Befehlen, jedoch keine allgemeine Überprüfung der Eingabe.Always validate user input: While EF does provide protection from SQL injection attacks, it does not do any general validation of input. Stammen Werte, die z.B. an APIs übergeben, in LINQ-Abfragen verwendet oder Entitätseigenschaften zugewiesen werden, aus einer nicht vertrauenswürdigen Quelle, sollte gemäß den Anwendungsanforderungen eine angemessene Prüfung vorgenommen werden.Therefore if values being passed to APIs, used in LINQ queries, assigned to entity properties, etc., come from an untrusted source then appropriate validation, per your application requirements, should be performed. Dies schließt alle Benutzereingaben ein, mit denen Abfragen dynamisch erstellt werden.This includes any user input used to dynamically construct queries. Wenn Sie Benutzereingaben zum Erstellen von Ausdrücken zulassen, müssen Sie selbst bei LINQ sicherstellen, dass nur beabsichtigte Ausdrücke erstellt werden können.Even when using LINQ, if you are accepting user input to build expressions you need to make sure than only intended expressions can be constructed.