Sobes.tech
Назад к вопросам
Junior — Middle
58

Можете объяснить, что подразумевается под термином 'чистый SQL' и в чем его отличие от ORM-методов?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

Чистый SQL — это использование текстовых SQL-команд для чтения и изменения данных напрямую через соединение с БД. В C# это может быть выполнение запроса через ADO.NET, Dapper или даже через ORM, но с передачей собственного SQL-строкового запроса.

ORM-методы — это работа через объектный API, где таблицы и записи представлены классами и сущностями, а операции с БД выполняются через методы и LINQ-запросы. ORM берет на себя генерацию SQL, отслеживание изменений и маппинг результатов в объекты.

Пример использования:

Чистый SQL удобен, когда нужен сложный отчет, оптимизированный запрос или специфичная для конкретной СУБД конструкция. ORM-методы чаще используют в CRUD-сценариях, где важны скорость разработки и читаемость.

// Чистый SQL через ADO.NET
using var connection = new SqlConnection(connectionString);
using var command = new SqlCommand(
    "SELECT Id, Name FROM Users WHERE IsActive = @IsActive", connection);

command.Parameters.AddWithValue("@IsActive", true);

await connection.OpenAsync();

using var reader = await command.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
    var id = reader.GetInt32(0);
    var name = reader.GetString(1);
}
// ORM-стиль через Entity Framework Core
var users = await dbContext.Users
    .Where(u => u.IsActive)
    .Select(u => new { u.Id, u.Name })
    .ToListAsync();

Пояснение кода:

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

Во втором примере SQL не пишется явно: вместо этого используется LINQ-выражение к сущности Users. ORM сам преобразует его в SQL и сам сопоставляет результат с объектами. Для типового запроса это проще и короче, но фактический SQL скрыт от разработчика.

Ключевые моменты:

  • Чистый SQL = прямое написание SQL-запросов без объектной абстракции.
  • ORM-методы = работа через сущности, а SQL генерируется автоматически.
  • Чистый SQL дает больше контроля, ORM — больше удобства и скорости разработки.
  • Для сложных, критичных по производительности запросов часто выбирают чистый SQL.
  • Для обычного CRUD и бизнес-логики чаще удобнее ORM.
  • На собеседовании важно показать, что ORM не отменяет SQL: он лишь скрывает его за API.