Введение в ORM Dapper в C#

Доброго времени суток! Сегодня мы рассмотрим с Вами C# библиотеку Dapper, которая представляет из себя объектно-реляционный маппер (ORM), т.е. с помощью данной библиотеки Вы можете автоматически конвертировать (маппить, отображать) строки из таблицы базы данных в C# объекты.

Целями Dapper являются простота кода и производительность.

У Dapper нет специфичных для базы данных деталей реализации, он работает со всеми реализациями ADO .NET, в том числе SQLite, Firebird, Oracle, MySQL, PostgreSQL и SQL Server.

После такого краткого введения, давайте рассмотрим код простых примеров. Но для начала нам необходимо в проект (проект должен быть создана Вами для начала) добавить две библиотеки:


# сама библиотека Dapper
$ dotnet add package dapper

# драйвер для работы с SqlServer
$ dotnet add package System.Data.SqlClient

Пример таблицы и данных, с которыми будем работать далее:


CREATE TABLE products(pname, price) (
    id INT identity(1,1) NOT NULL PRIMARY KEY,
    pname VARCHAR(255) NOT NULL,
    price INT
)

INSERT INTO products(pname, price) VALUES('prod 1', 126);
INSERT INTO products(pname, price) VALUES('prod 2', 271);
INSERT INTO products(pname, price) VALUES('prod 3', 300);
INSERT INTO products(pname, price) VALUES('prod 4', 290);
INSERT INTO products(pname, price) VALUES('prod 5', 350);
INSERT INTO products(pname, price) VALUES('prod 6', 710);
INSERT INTO products(pname, price) VALUES('prod 7', 414);
INSERT INTO products(pname, price) VALUES('prod 8', 214);

Метод Dapper ExecuteScalar

Метод ExecuteScalar выполняет запрос, который выбирает одно значение.


using System.Data.SqlClient;
using Dapper;

namespace Myrusakov
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = @"Server=localhostSQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";

            using var con = new SqlConnection(connectionString);
            con.Open();

            // запрашиваем версию базы данных
            var version = con.ExecuteScalar<string>("SELECT @@VERSION");

            Console.WriteLine(version);
        }
    }
}

Метод Dapper Query

Метод Dapper.Query выполняет SQL-запрос и преобразует его в список объектов, переданных через тип шаблона.


using System.Data.SqlClient;
using Dapper;

namespace Myrusakov
{
    // класс продукта
    class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }

        public override string ToString()
        {
            return $"{Id} {Name} {Price}";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = @"Server=localhostSQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";

            using var con = new SqlConnection(connectionString);
            con.Open();

            var products = con.Query<Product>("SELECT * FROM products").ToList();

            products.ForEach(product => Console.WriteLine(product));
        }
    }
}

Как видно из примера выше строки из таблицы products автоматически преобразуются в список объектов Product.

Метод Dapper.Execute

Метод Execute выполняет SQL-запрос, например, Insert, Update и т.д.


using System.Data.SqlClient;
using Dapper;

namespace Myrusakov
{
    class Program
    {
        static void Main(string[] args)
        {
             var connectionString = @"Server=localhostSQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";

            using var con = new SqlConnection(connectionString);
            con.Open();

            // обновляем продукт
            int numberOfRows = con.Execute("UPDATE dbo.[products] SET [price] = 256 WHERE [id] = 1");

            Console.WriteLine("Количество измененных строк: ", numberOfRows);
        }
    }
}

Параметризованные запросы в Dapper

Параметризованные запросы повышают безопасность и производительность кода. При написании параметризованных запросов, мы используем заполнители(начинаются с символа @) вместо прямой записи значений в запросы, что позволяет избежать SQL-инъекций.


using System.Data.SqlClient;
using Dapper;

namespace Myrusakov
{
    // класс продукта
    class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }

        public override string ToString()
        {
            return $"{Id} {Name} {Price}";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = @"Server=localhostSQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";

            using var con = new SqlConnection(connectionString);
            con.Open();

            // берем первый элемент с помощью метода QueryFirst
            // @id - заполнитель, на место которого подставляется значение из new { id = 1 }
            var product = con.QueryFirst<Product>("SELECT * FROM products WHERE [email protected]",  new { Id = 1 });

            Console.WriteLine(product);
        }
    }
}

Удаление строки из таблицы в Dapper


using System.Data.SqlClient;
using Dapper;

namespace Myrusakov
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = @"Server=localhostSQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";

            using var con = new SqlConnection(connectionString);
            con.Open();

            // удаляем строку из таблицы
            // здесь также данные передаются через заполнители (!)
            int res = con.Execute(@"DELETE FROM [products] WHERE Id = @Id", new { Id = 1 });

            if (res > 0)
                Console.WriteLine("Продукт удален");
        }
    }
}

Класс DynamicParameters в C# Dapper

Класс DynamicParameters в Dapper представляет собой динамические параметры — набор параметров, которые могут быть переданы методам Query и Execute.


sing System.Data;
using System.Data.SqlClient;
using Dapper;

namespace Myrusakov
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = @"Server=localhostSQLEXPRESS;Database=myrusakovdb;Trusted_Connection=True;";

            using var con = new SqlConnection(connectionString);
            con.Open();

            var query = "INSERT INTO products(pname, price) VALUES(@pname, @price)";

            var dynamicParams = new DynamicParameters();

            // название продукта
            dynamicParams.Add("@pname", "Prod 19", DbType.AnsiString, ParameterDirection.Input, 255);
            // цена
            dynamicParams.Add("@price", 366);

            // выполняем запрос (query) с параметрами (dynamicParams)
            int res = con.Execute(query, dynamicParams);

            if (res > 0)
                Console.WriteLine("Продукт добавлен");
        }
    }
}

В этой статье мы рассмотрели с Вами, как работать с базой данных на C# с помощью библиотеки Dapper.

Источник