Como funciona a consultaHow Queries Work

O Entity Framework Core usa LINQ (Consulta Integrada à Linguagem) para consultar dados do banco de dados.Entity Framework Core uses Language Integrate Query (LINQ) to query data from the database. O LINQ permite que você use C# (ou a linguagem .NET de sua escolha) para escrever consultas fortemente tipadas com base em suas classes derivadas de contexto e 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 de uma consultaThe life of a query

Veja a seguir uma visão geral de alto nível do processo pelo qual cada consulta passa.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 processada 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 precise ser feito sempre que a consulta for 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 do 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 convertidas 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 for um rastreamento de consulta, o EF verificará 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 será criada, o controle de alterações será configurado e a nova entidade será retornadaIf not, a new entity is created, change tracking is setup, and the new entity is returned
    2. Se for uma consulta sem rastreamento, o EF verificará se os dados representam uma entidade já no conjunto de resultados para essa consultaIf this is a no-tracking query, EF checks if the data represents an entity already in the result set for this query
      • Nesse caso, a entidade existente será retornada (1)If so, the existing entity is returned (1)
      • Caso contrário, uma nova entidade será criada e retornadaIf not, a new entity is created and returned

(1) As consultas sem acompanhamento usam referências fracas para controlar as 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 a coleta de lixo é executada, você poderá 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, 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 dos resultados em um loop forIterating the results in a for loop
  • Como usar 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: embora o EF forneça 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 forem passados para as APIs, usados em consultas LINQ, atribuídos para propriedades de entidade etc., vindos de uma fonte não confiável, a validação apropriada, de acordo com os requisitos do aplicativo, deverá ser executada.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 consultas dinamicamente.This includes any user input used to dynamically construct queries. Mesmo ao usar o LINQ, se você está aceitando entrada do usuário para criar expressões, precisa para garantir que apenas as expressões pretendidas possam ser criadas.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.