Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Entity Framework Core использует интегрированный язык запросов (LINQ) для запроса данных из базы данных. LINQ позволяет использовать C# (или выбранный язык .NET) для записи строго типизированных запросов на основе производных классов контекста и сущностей.
Замечание
Эта статья устарела, а некоторые части должны быть обновлены для учета изменений, произошедших в конструкторе конвейера запросов. Если у вас есть какие-либо сомнения по поводу любого поведения, упомянутого здесь, пожалуйста, задайте вопрос.
Жизнь запроса
В следующем описании представлен общий обзор процесса, который проходит каждый запрос.
- Запрос LINQ обрабатывается Entity Framework Core для создания представления, готового к обработке поставщиком базы данных.
- Результат кэшируется таким образом, чтобы эта обработка не должна выполняться каждый раз при выполнении запроса.
- Результат передается поставщику базы данных
- Поставщик базы данных определяет, какие части запроса можно оценить в базе данных.
- Эти части запроса переводятся на язык запросов для конкретной базы данных (например, SQL для реляционной базы данных)
- Запрос отправляется в базу данных и возвращается результирующий набор (при этом результаты — это значения из базы данных, а не экземпляры сущностей).
- Для каждого элемента в результирующем наборе
- Если запрос является запросом отслеживания, EF проверяет, представляют ли данные сущность, уже находящуюся в трекере изменений для данного экземпляра контекста.
- Если это так, возвращается существующая сущность
- Если нет, создается новая сущность, выполняется настройка отслеживания изменений и возвращается новая сущность.
- Если запрос без отслеживания, всегда создается и возвращается новая сущность.
- Если запрос является запросом отслеживания, EF проверяет, представляют ли данные сущность, уже находящуюся в трекере изменений для данного экземпляра контекста.
При выполнении запросов
При вызове операторов LINQ вы просто создаете в памяти представление запроса. Запрос отправляется в базу данных только тогда, когда результаты получены.
Наиболее распространенными операциями, которые приводят к отправке запроса в базу данных, являются:
- Итерация результатов в цикле
for - Использование оператора, например
ToList,ToArray,SingleCountили эквивалентных асинхронных перегрузок
Предупреждение
Всегда проверяйте входные данные пользователей: Хотя EF Core защищает от атак внедрения SQL с помощью параметров и экранирования литералов в запросах, он не проверяет входные данные. Соответствующая проверка в соответствии с требованиями приложения должна выполняться до того, как значения из ненадежных источников используются в запросах LINQ, назначены свойствам сущности или передаются другим API EF Core. Сюда входят все входные данные пользователя, используемые для динамического создания запросов. Даже при использовании LINQ, если вы принимаете входные данные пользователя для построения выражений, необходимо убедиться, что можно создавать только предполагаемые выражения.