Jak działają zapytańHow Queries Work

Entity Framework Core używa języka integracji zapytania (LINQ) wykonać zapytania o dane z bazy danych.Entity Framework Core uses Language Integrate Query (LINQ) to query data from the database. LINQ umożliwia przy użyciu języka C# (lub z języka .NET) do zapisania jednoznacznie zapytań opartych na klas pochodnych kontekstu i jednostki.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.

Czas życia zapytaniaThe life of a query

Poniżej znajduje się wysokiego poziomu Omówienie procesu, który przechodzi każdego zapytania.The following is a high level overview of the process each query goes through.

  1. Zapytania LINQ jest przetwarzany przez Entity Framework Core do budowania reprezentacji, który jest gotowy do przetwarzania dostawca bazy danychThe LINQ query is processed by Entity Framework Core to build a representation that is ready to be processed by the database provider
    1. Wynik jest buforowany, dzięki czemu to przetwarzanie nie musi odbywać się za każdym razem, gdy zapytanie jest wykonywaneThe result is cached so that this processing does not need to be done every time the query is executed
  2. Wynik jest przekazywany do dostawcy bazy danychThe result is passed to the database provider
    1. Dostawca bazy danych identyfikuje części zapytania, które może przyjąć w bazie danychThe database provider identifies which parts of the query can be evaluated in the database
    2. Te części zapytania są tłumaczone na język określonej kwerendy bazy danych (np. SQL relacyjnej bazy danych)These parts of the query are translated to database specific query language (e.g. SQL for a relational database)
    3. Co najmniej jednego zapytania są wysyłane do bazy danych i zestaw zwrócony wyników (wyniki są wartości z bazy danych, nie wystąpień jednostek)One or more queries are sent to the database and the result set returned (results are values from the database, not entity instances)
  3. Dla każdego elementu w zestawie wynikówFor each item in the result set
    1. Jeśli jest to zapytanie śledzenia, EF sprawdza, czy dane reprezentuje jednostkę już w śledzenia zmian dla wystąpienia kontekstuIf this is a tracking query, EF checks if the data represents an entity already in the change tracker for the context instance
      • Jeśli tak, zwracany jest istniejącej jednostkiIf so, the existing entity is returned
      • Jeśli nie jest tworzony nowy obiekt, skonfigurowano śledzenie zmian i nowy obiekt jest zwracanyIf not, a new entity is created, change tracking is setup, and the new entity is returned
    2. Jeśli jest to zapytanie nie śledzenia, EF sprawdza, czy dane reprezentuje jednostkę już w zestawu wyników dla tego zapytaniaIf this is a no-tracking query, EF checks if the data represents an entity already in the result set for this query
      • Jeśli tak, zostanie zwrócony istniejącej jednostki (1)If so, the existing entity is returned (1)
      • W przeciwnym razie nowy obiekt zostanie utworzona i zwróconaIf not, a new entity is created and returned

(1) Nie ma zapytań, śledzenie użycia słabe odwołania do śledzenia jednostek, które już zostały zwrócone.(1) No tracking queries use weak references to keep track of entities that have already been returned. Jeśli poprzedni wynik o tej samej tożsamości wykracza poza zakres i wyrzucanie elementów bezużytecznych działa, możesz uzyskać nowego wystąpienia jednostki.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance.

Podczas wykonywania kwerendyWhen queries are executed

Podczas wywoływania LINQ operatory są po prostu budowania reprezentacji w pamięci zapytania.When you call LINQ operators, you are simply building up an in-memory representation of the query. Zapytanie jest wysyłane do bazy danych tylko wtedy, gdy wyniki są używane.The query is only sent to the database when the results are consumed.

Najbardziej typowe operacje, które powoduje zapytania są wysyłane do bazy danych są:The most common operations that result in the query being sent to the database are:

  • Iteracja wyniki w for pętliIterating the results in a for loop
  • Przy użyciu operatora, takich jak ToList, ToArray, Single,CountUsing an operator such as ToList, ToArray, Single, Count
  • Element dataBinding wyników zapytania do interfejsu użytkownikaDatabinding the results of a query to a UI

Ostrzeżenie

Sprawdzanie poprawności danych wejściowych użytkownika: podczas EF zapewnia ochronę przed atakami iniekcji kodu SQL, nie ma żadnych ogólne sprawdzania poprawności danych wejściowych.Always validate user input: While EF does provide protection from SQL injection attacks, it does not do any general validation of input. W związku z tym jeśli wartości były przekazywane do interfejsów API, które są używane w zapytaniach LINQ, przypisane do właściwości obiektu itp., pochodzi z niezaufanego źródła, a następnie odpowiednią sprawdzania poprawności, zgodnie z wymaganiami aplikacji należy wykonać.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. W tym wszystkie dane wejściowe użytkownika używane do dynamicznego tworzenia zapytania.This includes any user input used to dynamically construct queries. Nawet w przypadku używania LINQ, jeśli akceptujesz wprowadzenia danych przez użytkownika do kompilacji wyrażeń, które należy się upewnić, niż tylko danego wyrażenia może być skonstruowany.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.