Funktionsweise von AbfragenHow Queries Work

Entity Framework Core verwendet Language integrieren Query (LINQ) zum Abfragen von Daten aus der Datenbank.Entity Framework Core uses Language Integrate Query (LINQ) to query data from the database. LINQ ermöglicht Ihnen die Verwendung von c# (oder Ihre Sprache .NET) um stark typisierte Abfragen basierend auf Ihren abgeleiteten Klassen von Kontext und die Entität 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.

Die Lebensdauer einer AbfrageThe life of a query

Der folgende Code ist eine grobe Übersicht des Prozesses, der bei jeder Abfrage durchläuft.The following is a high level overview of the process each query goes through.

  1. Die LINQ-Abfrage wird vom Entity Framework Core eine Darstellung zu erstellen, die von dem Datenbankanbieter verarbeitet werden kannThe 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 diese Verarbeitung muss nicht ausgeführt werden, jedes Mal, wenn die Abfrage ausgeführt wird, zwischengespeichert.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 identifiziert, welche Teile der Abfrage ausgewertet werden können, in der DatenbankThe database provider identifies which parts of the query can be evaluated in the database
    2. Diese Teile der Abfrage werden in bestimmten Abfragesprache für Datenbank (z. B. SQL für eine relationale Datenbank) übersetzt.These parts of the query are translated to database specific query language (e.g. SQL for a relational database)
    3. Eine oder mehrere Abfragen werden an die Datenbank und das zurückgegebene Resultset gesendet (Ergebnisse sind Werte aus der Datenbank, die keine Instanzen der Entität)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 ResultsetFor each item in the result set
    1. Ist dies einer Überwachungsabfrage, EF überprüft, wenn die Daten bereits in der änderungsnachverfolgung für die Kontextinstanz eine Entität darstelltIf 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, änderungsnachverfolgung eingerichtet ist 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. Ist dies ein ohne-Überwachungsabfrage überprüft EF, wenn die Daten bereits in das Resultset für diese Abfrage eine Entität darstelltIf this is a no-tracking query, EF checks if the data represents an entity already in the result set for this query
      • Wenn also die vorhandene Entität zurückgegeben wird (1)If so, the existing entity is returned (1)
      • Wenn nicht, eine neue Entität erstellt und zurückgegeben wirdIf not, a new entity is created and returned

(1) Keine Überwachungsabfragen verwenden schwache Verweise zum Nachverfolgen Entitäten, 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ültigkeitsbereich verlässt, und die Garbagecollection ausführt, 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.

Wenn Abfragen ausgeführt werdenWhen queries are executed

Wenn Sie LINQ-Operatoren aufrufen, erstellen Sie einfach eine in-Memory-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.

Die allgemeinsten Vorgänge, die in der Abfrage wird an die Datenbank gesendet werden:The most common operations that result in the query being sent to the database are:

  • Durchlaufen die Ergebnisse in einem for SchleifeIterating the results in a for loop
  • Mit einem anderen Operator wie z. B. ToList, ToArray, Single,CountUsing an operator such as ToList, ToArray, Single, Count
  • DataBinding die Ergebnisse einer Abfrage an eine BenutzeroberflächeDatabinding the results of a query to a UI

Warnung

Überprüfen Sie immer alle Benutzereingaben: während EF bietet Schutz vor SQL Injection-Angriffen, aber keine allgemeinen Ü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. Aus diesem Grund Werte, die APIs, die in LINQ-Abfragen zugewiesen Entitätseigenschaften usw., verwendet übergeben werden entsprechende Überprüfung pro den Anforderungen Ihrer Anwendung aus einer nicht vertrauenswürdigen Quelle stammt muss ausgeführt 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 verwendet, um Abfragen dynamisch zu erstellen.This includes any user input used to dynamically construct queries. Selbst wenn LINQ verwendet, wenn Sie zulassen, dass Benutzereingaben, zum Erstellen von Ausdrücken als nur beabsichtigte Ausdrücke sicherzustellen, müssen Sie erstellt werden kann.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.