Выполнение нативного SQL в Entity Framework без Ado.net
Быстрый ответ
Да, Entity Framework (EF) поддерживает использование нативного SQL как для запросов, не имеющих отношения к возврату данных (через метод DbContext.Database.ExecuteSqlRaw()
), так и для запросов,回报回报с результатами (через DbContext.Database.FromSqlRaw<T>()
). Вот пример использования нативного SQL на примере получения списка пользователей:
var users = dbContext.Users.FromSqlRaw("SELECT * FROM Users").ToList();
А также пример удаления пользователя:
dbContext.Database.ExecuteSqlRaw("DELETE FROM Users WHERE Id = 1");
Но это только начало. Давайте рассмотрим более подробно способы использования нативных SQL-команд в Entity Framework.
Тонкие настройки и соображения
Получение результатов запроса
Для того чтобы получить данные из результатов SQL-запроса, можно применить метод DbContext.Database.SqlQuery<T>()
:
var users = dbContext.Users.SqlQuery("SELECT * FROM Users WHERE Age > 18").ToList();
Безопасность и SQL-инъекции
Важно не забывать про параметризацию запросов, особенно в случаях, когда они включают данные, введённые пользователем – это может помощь защититься от SQL-инъекций. Entity Framework значительно упрощает этот процесс:
var user = dbContext.Users.FromSqlRaw("SELECT * FROM Users WHERE Username = {0}", username).FirstOrDefault();
Выполнение команд без возврата результатов
Вам могут пригодиться методы ExecuteSqlRaw()
или ExecuteSqlInterpolated()
, предназначенные для операций, которые не предполагают возврат данных. ExecuteSqlInterpolated()
позволит использовать синтаксис интерполированного SQL с повышенной безопасностью:
dbContext.Database.ExecuteSqlInterpolated($"DELETE FROM Users WHERE LastLogin < {thresholdDate}");
Гармоничное взаимодействие нативного SQL с EF
Сложные SQL-сценарии
Для выполнения действий со сложной логикой, которые включают работу с XML или хранимыми процедурами, можно использовать нативный SQL.
Учёт производительности
Нативные SQL-запросы могут быть более эффективными при высоких требованиях к производительности или в случаях массовых операций по сравнению с традиционными операциями ORM.
Слежение за информированностью контекста EF
Не забывайте следить, чтобы контекст EF был осведомлён о тех изменениях в БД, которые вызваны SQL-запросами. Управлять этим можно с помощью context.ChangeTracker.QueryTrackingBehavior
.
Использование нативного SQL по необходимости
Постарайтесь, по возможности, придерживаться встроенных возможностей EF, извлекая их преимущества полностью, и обращаться к нативному SQL только в случаях, когда он не справляется без него.
Управление соединением при работе с нативным SQL
Прямое выполнение и команды
При запуске нативных SQL-команд важно уделять внимание управлению состоянием соединения с БД. EF управляет соединениями автоматически для LINQ операций, но при работе с нативным SQL это необходимо контролировать вручную:
using (var context = new MyDbContext())
{
var connection = context.Database.GetDbConnection();
connection.Open();
// Теперь можно выполнить нативный SQL.
connection.Close();
}
Визуализация
Работа с Entity Framework напоминает выбор блюда из меню ресторана 🍽️, в то время как использование нативного SQL — это похоже на приготовление блюда по собственному рецепту, используя доступные продукты 🍲.
EF можно сравнить с: [🍔 ORM Бургер, 🍵 Набор LINQ]
Нативный SQL как: ['SELECT * FROM кухня']
Будьте готовы к работе с EF и вместе с тем к шеф-поварскому творчеству с нативным SQL! 👩🍳
Бесконечные возможности с нативным SQL
Создание SQL-репозитория
Подумайте о создании универсального репозитория для инкапсуляции всех операций с нативным SQL, чтобы отделить его сложности от остальной части приложения.
CRUD с ObjectSet
Если вы используете более раннюю версию EF и работаете с ObjectSet
для операций CRUD, то доступны возможности нативного SQL:
var numberAffected = context.ObjectSet.ExecuteStoreCommand("DELETE FROM Users WHERE Age < 18");
Работа со сложными типами данных
EF может помочь преодолеть некоторые ограничения, например, со сложными типами данных, вроде XML, используя нативный SQL, при этом не ущемляя преимуществ EF в других частях взаимодействия с приложением.
Полезные материалы
- SQL Queries – EF Core | Microsoft Learn — Официальная документация на SQL-запросы в EF Core.
- Executing Raw SQL Queries using Entity Framework Core — Подробное руководство по использованию нативного SQL в EF Core.
- EF6 and EF Core Bulk Extensions | Bulk Insert, Update, Delete, Upsert — Ознакомление с расширениями EF для быстрых массовых операций и SQL-команд.
- When to use DbSet.SqlQuery vs Database.SqlQuery vs Database.ExecuteSqlCommand — Обсуждение относительно того, когда стоит использовать различные методы для SQL-запросов на EF.
- Видео: Entity Framework Core – Работа с нативным SQL — Видеоурок о том, как работать с EF и нативным SQL.
- Dapper vs Entity Framework vs ADO.NET Performance Benchmarking — Сравнение производительности, включая использование нативного SQL, для оценки скорости работы EF.