Dapper ORM (объектно-реляционный преобразователь) приобрел широкую популярность для работы с базами данных в .NET благодаря своей высокой скорости и простоте. Мы изучили основы работы с Dapper в предыдущей статье здесь. Мы также обсуждали работу с библиотекой Dapper Extensions в предыдущей статье. В этой статье мы рассмотрим некоторые дополнительные функции Dapper.
Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.
Создайте проект веб-API ASP.NET Core в Visual Studio 2022.
Прежде всего, давайте создадим проект ASP.NET Core 7 в Visual Studio 2022. Выполните следующие действия:
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и расположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальное количество API)». В этом проекте мы не будем использовать минимальные API. Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить поддержку Open API», «Настроить для HTTPS» и «Включить Docker» не отмечены. Мы не будем использовать эти функции здесь.
- Щелкните Создать.
Мы будем использовать этот проект веб-API ASP.NET Core 7 для работы с расширенными функциями Dapper в следующих разделах.
Что такое Даппер? Зачем это использовать?
Объектно-реляционные преобразователи использовались в течение многих лет для устранения «несоответствия импеданса» между объектными моделями в языках программирования и моделями данных в реляционных базах данных. Команда Stack Overflow создала Dapper как простую ORM для .NET. Dapper — это проект с открытым исходным кодом на GitHub.
Dapper — это легкая, высокопроизводительная среда микро-ORM для .NET и .NET Core, которая поддерживает широкий спектр баз данных. К ним относятся Microsoft SQL Server, Oracle Database, MySQL, PostgreSQL, SQLite и SQL CE. По сравнению с другими ORM, Dapper легкий, быстрый и простой, разработанный с учетом производительности и удобства использования.
Расширенные функции в Dapper
В этом разделе мы рассмотрим некоторые расширенные функции Dapper с соответствующими примерами кода.
Мульти-отображение
Функция множественного сопоставления Dapper позволяет сопоставлять результаты запроса с несколькими объектами. Этот тип запроса можно использовать для получения релевантных данных из множества таблиц с помощью одного запроса. Передав функцию делегата в качестве аргумента методу Query или методу QueryAsync, вы можете указать Dapper сопоставлять результаты запроса с различными объектами. Рассмотрим следующие два класса.
public class Author { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } public class Book { public int Id { get; set; } public int AuthorId { get; set; } public string Title { get; set; } public string ISBN { get; set; } }
Следующий фрагмент кода иллюстрирует, как можно реализовать множественное сопоставление с помощью Dapper.
string connectionString = "Specify the connection string to connect to your database..."; using (var connection = new SqlConnection(connectionString)) { string query = "SELECT * from Authors A Inner Join Books B ON A.Id = B.AuthorId"; var authors = connection.Query<Author, Book, Author>( query, (author, book) => { author.Books = author.Books ?? new List<Book>(); author.Books.Add(book); }, splitOn: "Id" ).Distinct().ToList(); }
Поддержка широкой базы данных
Dapper поддерживает подключение и работу с несколькими типами баз данных, такими как SQL Server, Oracle Database, MySQL и PostgreSQL. Следующие фрагменты кода показывают, как вы можете подключиться к этим разным базам данных с помощью Dapper.
var connection = new SqlConnection(connectionString); //Connecting to SQL Server database
var connection = new OracleConnection(connectionString); //Connecting to Oracle database
var connection = new MySqlConnection(connectionString); //Connecting to MySQL database
var connection = new NpgsqlConnection(connectionString); //Connecting to PostgreSQL database
Объемная вставка
Dapper предоставляет операции массовой вставки, которые могут значительно повысить производительность, когда вы пытаетесь вставить большие объемы данных в свою базу данных. Класс SqlBulkCopy в ADO.NET обеспечивает эффективную передачу данных между источником и базой данных. В Dapper вы можете выполнять массовые вставки, передавая перечисляемую коллекцию объектов в SqlMapperExtensions.Insert.
В следующем примере кода показано, как выполнять массовые вставки с помощью Dapper в приложении ASP.NET Core 7.
using (var connection = new SqlConnection(connectionString)) { connection.Open(); var orders = GetOrders(); var transaction = connection.BeginTransaction(); try { connection.Execute("INSERT INTO Orders (Id, ProductId, Amount) Values (@Id, @ProductId, @Amount)", orders); transaction.Commit(); } catch { transaction.Rollback(); throw; } return; }
Хранимые процедуры
Вы можете использовать методы Query, QueryFirstOrDefault, Execute и подобные для вызова хранимых процедур в Dapper. Dapper также поддерживает взаимодействие с выходными параметрами и возвращаемыми значениями хранимых процедур через класс DynamicParameters, что упрощает работу с параметрами.
В приведенном ниже примере кода показано, как можно работать с хранимыми процедурами с помощью Dapper в приложении ASP.NET Core 7.
using (var connection = new SqlConnection(connectionString)) { var parameters = new DynamicParameters(); int customerId = 27; string orderStatus = "Pending"; parameters.Add("@CustomerId", customerId, DbType.Int32); parameters.Add("@OrderStatus", orderStatus, DbType.String); var orders = connection.Query<Order>("GetOrdersByStatus", parameters, commandType: CommandType.StoredProcedure); // Write your code here to process the retrieved orders return orders.ToList(); }
Пагинация запроса
При работе с большими наборами результатов нумерация страниц имеет решающее значение для повышения производительности и эффективности. Методы Skip и Take в Dapper можно использовать для разбивки запроса на страницы. Комбинируя эти методы с предложениями SQL OFFSET и FETCH NEXT, вы можете эффективно извлекать подмножество данных из базы данных.
Ниже приведен пример кода, иллюстрирующий, как в Dapper можно использовать разбиение на страницы запросов.
string connectionString = "Specify the connection string to connect to your database..."; using (var connection = new SqlConnection(connectionString)) { var pageNumber = 1; var pageSize = 10; var offset = (pageNumber - 1) * pageSize; var query = @" SELECT * FROM Orders ORDER BY OrderId OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY"; var parameters = new { Offset = offset, PageSize = pageSize }; return connection.Query<Order>(query, parameters).ToList(); }
Кэширование запросов
Это отличная функция в Dapper, которая значительно повышает производительность, особенно если запросы выполняются часто. Вы можете кэшировать запросы и результаты в Dapper. Когда вы выполняете запрос в первый раз, результаты выполнения запроса сохраняются в кэше. Всякий раз, когда тот же запрос выполняется снова и данные доступны в кэше, вместо извлечения данных из вызова API или базы данных возвращаются кэшированные данные.
В следующем примере кода показано, как можно использовать кэширование запросов.
var sql = "SELECT * FROM Authors WHERE AuthorId = @AuthorId"; var author = connection.QueryFirstOrDefault<Author>(sql, new { AuthorId = authorId }); // When the query is executed the next time, it will use the cached result var cachedAuthor = connection.QueryFirstOrDefault<Author>(sql, new { AuthorId = authorId });
Динамические параметры
Dapper позволяет передавать значения параметров запросам с использованием анонимных типов или словарей. Эта функция полезна, когда количество параметров или их значения неизвестны во время компиляции. Следующий фрагмент кода иллюстрирует, как вы можете использовать эту функцию в Dapper.
using (var connection = new SqlConnection(connectionString)) { var parameters = new { CustomerId = 1, OrderStatus = "Shipped" }; var query = "Select * From Orders Where CustomerId = @CustomerId AND Status = @OrderStatus"; var orders = connection.Query<Order>(query, parameters).ToList(); // Write your code here to process the retrieved orders return orders.ToList(); }
Dapper — это легкая и настраиваемая ORM, ориентированная на производительность и простоту. Сложные функции Dapper могут значительно улучшить возможности доступа к данным и позволить разработчикам более эффективно взаимодействовать с базами данных в приложениях ASP.NET Core.
Хотя Dapper обладает довольно богатым функционалом, он не предоставляет всех функций более мощных ORM, таких как Entity Framework. Поэтому важно проанализировать требования вашего приложения и выбрать подходящую технологию доступа к данным.