Что такое Dapper и для чего он используется?

«Что такое Dapper и для чего он используется?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

  • Высокая производительность: Dapper работает поверх ADO.NET (IDbConnection), добавляя очень мало оверхеда. Он часто быстрее полноценных ORM, таких как Entity Framework Core.
  • Простота и контроль: Вы пишете чистый SQL, что дает полный контроль над запросами, но Dapper берет на себя рутинную работу по маппингу данных из DataReader в ваши классы.
  • Безопасность: Полная поддержка параметризованных запросов для защиты от SQL-инъекций.

Базовый пример использования:

using Dapper;
using System.Data.SqlClient;

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

string connectionString = "YourConnectionString";

using (var connection = new SqlConnection(connectionString))
{
    // Query<T> выполняет запрос и маппит результат на коллекцию объектов User
    var activeUsers = connection.Query<User>(
        "SELECT Id, Name, Email FROM Users WHERE IsActive = @IsActive",
        new { IsActive = true } // Параметризация через анонимный объект
    );

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

    // Execute для команд INSERT/UPDATE/DELETE
    var rowsAffected = connection.Execute(
        "UPDATE Users SET LastLogin = @Now WHERE Id = @Id",
        new { Now = DateTime.UtcNow, Id = 42 }
    );
}

Плюсы Dapper:

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

Минусы (по сравнению с EF Core):

  • Нет миграций: Структуру базы данных (DDL) нужно обновлять отдельно (например, через DbUp или Flyway).
  • Нет трекинга изменений: Для обновления сущности нужно явно вызывать Execute с UPDATE-запросом.
  • Больше ручного кода: Нужно писать SQL для всех операций.

Итог: Dapper — отличный выбор для проектов, где важна максимальная производительность, есть сложные SQL-запросы или когда команда предпочитает иметь прямой контроль над SQL.