Как работают запросы

Entity Framework Core использует LINQ для запроса данных из базы данных. LINQ позволяет использовать C# (или предпочитаемый вами язык .NET) для написания строго типизированных запросов, основанных на производном контексте и классах сущностей.

Примечание

Эта статья устарела, и некоторые ее части необходимо обновить с учетом изменений, внесенных при создании конвейера запросов. Если у вас есть какие-либо сомнения о поведении, описанном здесь, задайте вопрос.

Срок действия запроса

Ниже приведено общее описание процесса, через который проходит каждый запрос.

  1. LINQ-запрос обрабатывается Entity Framework Core для создания представления, которое готово для обработки поставщиком данных.
    1. Результат кэшируется, чтобы не выполнять эту обработку каждый раз при выполнении запроса.
  2. Результат передается поставщику базы данных.
    1. Поставщик базы данных определяет, какие части запроса могут выполняться в базе данных.
    2. Эти части запроса преобразуются в язык запроса базы данных (например, SQL для реляционной базы данных).
    3. Запрос отправляется в базу данных, и возвращается результирующий набор (результатами являются значения из базы данных, а не экземпляры сущностей)
  3. Для каждого элемента в результирующем наборе выполняются следующие действия:
    1. Если запрос является запросом отслеживания, EF проверяет, не предоставляют ли данные сущность, которая уже находится в объекте отслеживания изменений для экземпляра контекста.
      • Если да, возвращается имеющаяся сущность.
      • Если нет, создается другая сущность, устанавливается объект отслеживания изменений и возвращается новая сущность.
    2. Если запрос не является отслеживаемым запросом, то всегда создается и возвращается новая сущность.

Когда выполняются запросы

При вызове операторов LINQ вы просто создаете представление запроса в памяти. Запрос отправляется в базу данных только после обработки результатов.

Ниже приведены наиболее распространенные операции, которые приводят к отправке запроса в базу данных.

  • Итерация результатов в цикле for.
  • Использование операторов, таких как ToList, ToArray, Single, Count, или эквивалентных асинхронных перегрузок

Предупреждение

Всегда проверяйте входные данные пользователя. Так как платформа EF Core с помощью параметров и экранирования литералов в запросах обеспечивает защиту от атак путем внедрения кода SQL, она не проверяет входные данные. Поэтому необходимо выполнять проверку в соответствии с требованиями отдельного приложения, прежде чем значения из непроверенных источников будут использоваться в LINQ-запросах, назначенные свойствам сущности или передаваемые другим API EF Core. Сюда входят все входные данные пользователя, используемые для динамического формирования запросов. Даже при использовании LINQ, если вы принимаете входные данные пользователя для создания выражений, необходимо убедиться, что можно создать только предполагаемые выражения.