Что такое Dapper?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое 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.