Como funcionam as consultasHow Queries Work

Entity Framework Core usa linguagem integrar LINQ (consulta) para consultar dados do banco de dados.Entity Framework Core uses Language Integrate Query (LINQ) to query data from the database. LINQ permite que você use c# (ou .NET idioma de sua escolha) para escrever consultas com rigidez de tipos com base em suas classes derivadas de contexto e a entidade.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.

A vida útil de uma consultaThe life of a query

A seguir está uma visão geral de alto nível do processo de que cada consulta atravessa.The following is a high level overview of the process each query goes through.

  1. A consulta LINQ é processada pelo Entity Framework Core para criar uma representação que está pronta para ser processado pelo provedor de banco de dadosThe LINQ query is processed by Entity Framework Core to build a representation that is ready to be processed by the database provider
    1. O resultado é armazenado em cache para que esse processamento não precisa ser feito sempre que a consulta é executadaThe result is cached so that this processing does not need to be done every time the query is executed
  2. O resultado é passado para o provedor de banco de dadosThe result is passed to the database provider
    1. O provedor de banco de dados identifica quais partes da consulta podem ser avaliadas no banco de dadosThe database provider identifies which parts of the query can be evaluated in the database
    2. Essas partes da consulta são convertidos em linguagem de consulta específica de banco de dados (por exemplo, SQL para um banco de dados relacional)These parts of the query are translated to database specific query language (e.g. SQL for a relational database)
    3. Uma ou mais consultas são enviadas para o banco de dados e o conjunto de resultados retornado (resultados são valores do banco de dados, não as instâncias de entidade)One or more queries are sent to the database and the result set returned (results are values from the database, not entity instances)
  3. Para cada item no conjunto de resultadosFor each item in the result set
    1. Se esse for um rastreamento de consulta, EF verifica se os dados representam uma entidade já no controlador de alterações para a instância de contextoIf this is a tracking query, EF checks if the data represents an entity already in the change tracker for the context instance
      • Nesse caso, a entidade existente será retornadaIf so, the existing entity is returned
      • Caso contrário, uma nova entidade é criada, o controle de alterações estão configurado e a nova entidade for retornadaIf not, a new entity is created, change tracking is setup, and the new entity is returned
    2. Se essa é uma consulta de acompanhamento não, EF verifica se os dados representam uma entidade que já estão no conjunto de resultados para esta consultaIf this is a no-tracking query, EF checks if the data represents an entity already in the result set for this query
      • Se assim, a entidade existente for retornada (1)If so, the existing entity is returned (1)
      • Caso contrário, uma nova entidade é criada e retornadaIf not, a new entity is created and returned

(1) Consultas sem controle usam referências fracas para manter o controle de entidades que já foram retornadas.(1) No tracking queries use weak references to keep track of entities that have already been returned. Se um resultado anterior com a mesma identidade sai do escopo e coleta de lixo é executado, você pode receber uma nova instância da entidade.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance.

Quando as consultas são executadasWhen queries are executed

Quando você chama operadores LINQ, você está criando simplesmente uma representação na memória da consulta.When you call LINQ operators, you are simply building up an in-memory representation of the query. A consulta é enviada somente para o banco de dados quando os resultados são consumidos.The query is only sent to the database when the results are consumed.

As operações mais comuns que resultam na consulta que está sendo enviada para o banco de dados são:The most common operations that result in the query being sent to the database are:

  • Iteração os resultados em um for loopIterating the results in a for loop
  • Usando um operador como ToList, ToArray, Single,CountUsing an operator such as ToList, ToArray, Single, Count
  • Associação de dados de resultados de uma consulta para uma interface de usuárioDatabinding the results of a query to a UI

Aviso

Sempre valide a entrada do usuário: EF enquanto fornecem proteção contra ataques de injeção de SQL, ele não faz nenhuma validação geral de entrada.Always validate user input: While EF does provide protection from SQL injection attacks, it does not do any general validation of input. Portanto, se os valores sejam passados para APIs, usado em consultas LINQ, atribuídas para propriedades de entidade, etc., vêm de uma fonte não confiável, em seguida, validação apropriadas, por seus requisitos de aplicativo deve ser executado.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. Isso inclui qualquer entrada do usuário usada para construir dinamicamente consultas.This includes any user input used to dynamically construct queries. Mesmo ao usar o LINQ, se você está aceitando entrada do usuário construir expressões que você precisa garantir que somente as expressões pretendidas pode ser criada.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.