← Назад к вопросам

Что такое Dapper?

2.0 Middle🔥 161 комментариев
#Entity Framework и ORM#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Dapper?

Dapper — это легковесный, высокопроизводительный ORM (Object-Relational Mapper) для платформы .NET, разработанный командой Stack Overflow и распространяемый как open-source библиотека. В отличие от более тяжелых ORM, таких как Entity Framework, Dapper позиционируется как "микро-ORM", поскольку предоставляет минимальный набор функций для отображения результатов SQL-запросов на объекты C#, оставляя разработчику полный контроль над написанием SQL.


Ключевые особенности Dapper

  • Производительность. Dapper является одним из самых быстрых ORM для .NET. Его скорость достигается за счет минимального накладного расхода: он динамически генерирует код для маппинга с помощью Expression Trees и IL Emit, что выполняется один раз при первом запуске запроса, а затем кэшируется. Это делает его в разы быстрее традиционных ORM, использующих рефлексию.
  • Прямая работа с SQL. Разработчик пишет "родные" SQL-запросы или хранимые процедуры. Это дает полный контроль над оптимизацией запросов, использованием специфичных для базы данных функций и избеганием "магического" поведения, присущего некоторым ORM.
  • Простота и минимализм. Dapper не управляет состоянием объектов (отслеживанием изменений), не генерирует схемы базы данных и не имеет сложной конфигурации. Он расширяет стандартный IDbConnection из пространства имен System.Data несколькими методами-расширениями.
  • Безопасность. Dapper поощряет использование параметризованных запросов, что является основной защитой от SQL-инъекций. Параметры передаются как анонимные объекты или через объекты DynamicParameters.

Основные методы Dapper

Основная функциональность предоставляется через методы-расширения для IDbConnection. Вот ключевые из них:

1. Query<T>

Выполняет запрос и возвращает коллекцию объектов типа T.

using var connection = new SqlConnection(connectionString);
var sql = "SELECT * FROM Users WHERE Id = @UserId";
var users = connection.Query<User>(sql, new { UserId = 1 });

foreach (var user in users)
{
    Console.WriteLine($"Name: {user.Name}, Email: {user.Email}");
}

2. QueryFirst, QueryFirstOrDefault, QuerySingle, QuerySingleOrDefault

Используются для получения одной записи.

// Возвращает первую запись или исключение, если записей нет
var user = connection.QueryFirst<User>("SELECT * FROM Users WHERE Id = @Id", new { Id = 1 });

// Возвращает первую запись или null, если записей нет (безопасный вариант)
var userOrNull = connection.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE Email = @Email", new { Email = "test@mail.com" });

3. Execute

Выполняет команду (INSERT, UPDATE, DELETE) и возвращает количество затронутых строк.

var sql = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email)";
var rowsAffected = connection.Execute(sql, new { Name = "Alice", Email = "alice@example.com" });
Console.WriteLine($"Добавлено строк: {rowsAffected}");

4. ExecuteScalar

Выполняет запрос и возвращает первое значение первого столбца результата.

var userId = connection.ExecuteScalar<int>("SELECT Id FROM Users WHERE Email = @Email", new { Email = "alice@example.com" });

5. Работа с несколькими наборами результатов (QueryMultiple)

Позволяет выполнить один SQL-запрос, возвращающий несколько результирующих наборов.

var sql = @"
    SELECT * FROM Users WHERE Id = @Id;
    SELECT * FROM Orders WHERE UserId = @Id;
";

using (var multi = connection.QueryMultiple(sql, new { Id = 1 }))
{
    var user = multi.ReadFirst<User>();
    var orders = multi.Read<Order>().ToList();
}

Преимущества использования Dapper

  • Идеален для высоконагруженных систем, где критична производительность доступа к данным (например, сам Stack Overflow).
  • Полный контроль над SQL-запросами позволяет тонко оптимизировать сложные операции и использовать всю мощь конкретной СУБД.
  • Низкий порог входа и простота — не требуется изучать сложную конфигурацию или внутреннюю "магию" фреймворка.
  • Отлично сочетается с другими подходами, например, можно использовать Dapper для сложных отчетов, а Entity Framework — для CRUD-операций в одной системе.

Недостатки и ограничения

  • Необходимость писать SQL вручную может быть недостатком для команд, не имеющих экспертизы в SQL, или в проектах с часто меняющейся схемой БД.
  • Отсутствие автоматического отслеживания изменений (Change Tracking) и миграций схемы базы данных. Эти задачи ложатся на плечи разработчика.
  • Больше boilerplate-кода для простых операций по сравнению с полноценными ORM.

Когда выбирать Dapper?

Выберите Dapper, если:

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

Рассмотрите полноценный ORM (например, Entity Framework Core), если:

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

Таким образом, Dapper — это не замена Entity Framework, а мощный специализированный инструмент для сценариев, где критичны производительность и контроль над выполнением SQL-запросов. Его часто называют "королем микро-ORM" в экосистеме .NET.