Как использовать расширенные функции Dapper в ASP.NET Core

автор vadim


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. Выполните следующие действия:

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и расположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальное количество API)». В этом проекте мы не будем использовать минимальные API. Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию).
  9. Убедитесь, что флажки «Включить поддержку Open API», «Настроить для HTTPS» и «Включить Docker» не отмечены. Мы не будем использовать эти функции здесь.
  10. Щелкните Создать.

Мы будем использовать этот проект веб-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. Поэтому важно проанализировать требования вашего приложения и выбрать подходящую технологию доступа к данным.

Related Posts

Оставить комментарий