Выполнение нативного SQL в Entity Framework без Ado.net

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Да, Entity Framework (EF) поддерживает использование нативного SQL как для запросов, не имеющих отношения к возврату данных (через метод DbContext.Database.ExecuteSqlRaw()), так и для запросов,回报回报с результатами (через DbContext.Database.FromSqlRaw<T>()). Вот пример использования нативного SQL на примере получения списка пользователей:

csharp
Скопировать код
var users = dbContext.Users.FromSqlRaw("SELECT * FROM Users").ToList();

А также пример удаления пользователя:

csharp
Скопировать код
dbContext.Database.ExecuteSqlRaw("DELETE FROM Users WHERE Id = 1");

Но это только начало. Давайте рассмотрим более подробно способы использования нативных SQL-команд в Entity Framework.

Кинга Идем в IT: пошаговый план для смены профессии

Тонкие настройки и соображения

Получение результатов запроса

Для того чтобы получить данные из результатов SQL-запроса, можно применить метод DbContext.Database.SqlQuery<T>():

csharp
Скопировать код
var users = dbContext.Users.SqlQuery("SELECT * FROM Users WHERE Age > 18").ToList();

Безопасность и SQL-инъекции

Важно не забывать про параметризацию запросов, особенно в случаях, когда они включают данные, введённые пользователем – это может помощь защититься от SQL-инъекций. Entity Framework значительно упрощает этот процесс:

csharp
Скопировать код
var user = dbContext.Users.FromSqlRaw("SELECT * FROM Users WHERE Username = {0}", username).FirstOrDefault();

Выполнение команд без возврата результатов

Вам могут пригодиться методы ExecuteSqlRaw() или ExecuteSqlInterpolated(), предназначенные для операций, которые не предполагают возврат данных. ExecuteSqlInterpolated() позволит использовать синтаксис интерполированного SQL с повышенной безопасностью:

csharp
Скопировать код
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 это необходимо контролировать вручную:

csharp
Скопировать код
using (var context = new MyDbContext())
{
    var connection = context.Database.GetDbConnection();
    connection.Open();
    // Теперь можно выполнить нативный SQL.
    connection.Close();
}

Визуализация

Работа с Entity Framework напоминает выбор блюда из меню ресторана 🍽️, в то время как использование нативного SQL — это похоже на приготовление блюда по собственному рецепту, используя доступные продукты 🍲.

Markdown
Скопировать код
EF можно сравнить с: [🍔 ORM Бургер, 🍵 Набор LINQ]
Нативный SQL как: ['SELECT * FROM кухня']
Markdown
Скопировать код
Будьте готовы к работе с EF и вместе с тем к шеф-поварскому творчеству с нативным SQL! 👩‍🍳

Бесконечные возможности с нативным SQL

Создание SQL-репозитория

Подумайте о создании универсального репозитория для инкапсуляции всех операций с нативным SQL, чтобы отделить его сложности от остальной части приложения.

CRUD с ObjectSet

Если вы используете более раннюю версию EF и работаете с ObjectSet для операций CRUD, то доступны возможности нативного SQL:

csharp
Скопировать код
var numberAffected = context.ObjectSet.ExecuteStoreCommand("DELETE FROM Users WHERE Age < 18");

Работа со сложными типами данных

EF может помочь преодолеть некоторые ограничения, например, со сложными типами данных, вроде XML, используя нативный SQL, при этом не ущемляя преимуществ EF в других частях взаимодействия с приложением.

Полезные материалы

  1. SQL Queries – EF Core | Microsoft Learn — Официальная документация на SQL-запросы в EF Core.
  2. Executing Raw SQL Queries using Entity Framework Core — Подробное руководство по использованию нативного SQL в EF Core.
  3. EF6 and EF Core Bulk Extensions | Bulk Insert, Update, Delete, Upsert — Ознакомление с расширениями EF для быстрых массовых операций и SQL-команд.
  4. When to use DbSet.SqlQuery vs Database.SqlQuery vs Database.ExecuteSqlCommand — Обсуждение относительно того, когда стоит использовать различные методы для SQL-запросов на EF.
  5. Видео: Entity Framework Core – Работа с нативным SQL — Видеоурок о том, как работать с EF и нативным SQL.
  6. Dapper vs Entity Framework vs ADO.NET Performance Benchmarking — Сравнение производительности, включая использование нативного SQL, для оценки скорости работы EF.