Множественные SQL запросы в одной сессии с Dapper.NET

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

csharp
Скопировать код
using (var conn = new SqlConnection("your_conn_string"))
{
    var sql = "SELECT * FROM Users; SELECT * FROM Orders;";
    var multi = conn.QueryMultiple(sql);
    var users = multi.Read<User>().ToList();
    var orders = multi.Read<Order>().ToList();
}

Для параллельного выполнения нескольких запросов используйте метод QueryMultiple в Dapper. Он прекрасно подходит для быстрого наполнения коллекций необходимыми данными — всё это в паре строк кода, аккуратно и эффективно.

На максималках с QueryMultiple

Улучшайте работу своих операций, активируя QueryMultiple , метод библиотеки Dapper, созданный для сокращения числа обращений к базе данных. Используйте методы ReadSingle() или ReadSingleOrDefault(), чтобы быстро получать отдельные записи — так советуют разработчики библиотеки Dapper.

csharp
Скопировать код
var multi = connection.QueryMultiple(sql);
var singleUser = multi.ReadSingle<User>(); // Ожидается единственная запись, иначе будет вызвано исключение
var singleOrder = multi.ReadSingleOrDefault<Order>(); // В случае отсутствия записи вернётся null

Оставайтесь на чеку! Результаты вот-вот придут

Воспользуйтесь свойством GridReader.IsConsumed для динамической проверки доступности дополнительных наборов данных. Это защитит вас в случае, если наборы результатов не определены.

csharp
Скопировать код
while (!multi.IsConsumed)
{
    var extraResults = multi.Read();
    // Обработка дополнительных данных
}

Храните и обрабатывайте — всё под вашим контролем

Будьте готовы к обработке больших объёмов данных, сохраняя результаты QueryMultiple в коллекции.

csharp
Скопировать код
var resultsList = new List<object>();
while (!multi.IsConsumed)
{
    resultsList.Add(multi.Read());
}

Почему Dapper вне конкуренции

QueryMultiple значительно упрощает сложные задачи путем комбинации лёгкости в использовании и высокой производительности. Этот метод стоит в числе наиболее предпочтительных альтернатив ADO.NET.

Тайные подводные камни и профессиональные советы

  • Гарантировать безопасность и точность SQL-команды.
  • Используйте параметризованные запросы для предотвращения SQL-инъекций.
  • Придерживайтесь шаблона using для корректного освобождения ресурсов соединения.
  • Следите за производительностью своих запросов.

Визуализация

Визуализируйте выполнение нескольких SQL-запросов с помощью Dapper.NET как отправку птиц по одному маршруту полёта:

Markdown
Скопировать код
🚀 Раунд-Трип: SQL Станция А 🏷️ SELECT * FROM Customers; SQL Станция Б 🏷️ INSERT INTO Orders...; SQL Станция В 🏷️ UPDATE Inventory...

Каждая "птица" символизирует отдельный SQL-запрос:

Markdown
Скопировать код
🐦 (SELECT) 🦉 (INSERT) 🦅 (UPDATE)

В конце "полёта" все задачи выполнены эффективно:

Markdown
Скопировать код
🔁 Возвращение: [🐦 Клиенты, 🦉 Заказ подтверждён, 🦅 Инвентарь обновлён]

Вывод: Группировка операций в рамках одной транзакции экономит время и ресурсы — это подобно птицам, доставляющим несколько сообщений за один полёт.

Погружение: подгонка запросов под задачи

QueryMultiple Dapper даёт возможность кастомизировать запросы под ваши индивидуальные потребности. Рассмотрим несколько практических случаев использования:

Получение связанных данных

Одновременная выборка данных, связанных через внешний ключ — например, заказа и его элементов:

csharp
Скопировать код
using (var multi = conn.QueryMultiple(sql))
{
    var order = multi.Read<Order>().Single();
    order.Items = multi.Read<OrderItem>().ToList(); // Превосходное сочетание!
}

Сбор сводной информации и деталей

Получение статистики по клиентам и их заказам за один запрос — словно убить двух зайцев одним выстрелом!

csharp
Скопировать код
using (var multi = conn.QueryMultiple(sql))
{
    var customerStats = multi.ReadSingle<CustomerStats>();
    var customerOrders = multi.Read<Order>().ToList(); // Вся информация сразу!
}

Обработка результатов на основе условий

Настройте логику обработки в зависимости от полученных результатов:

csharp
Скопировать код
if (!multi.IsConsumed && multi.ReadSingle<int>() > 0)
{
    var customerOrders = multi.Read<Order>().ToList(); // Успех!
}

Обеспечение транзакционной целостности

При использовании QueryMultiple с транзакциями гарантируется сохранность данных:

csharp
Скопировать код
using (var transaction = conn.BeginTransaction())
{
    var multi = conn.QueryMultiple(sql, transaction: transaction);
    // Здесь обрабатываем результаты
    transaction.Commit(); // И закрываем процесс
}

Полезные материалы

  1. Тестирование программ на D на FreeBSD для компиляции на OSX — Обсуждение на Stack Overflow о работе с множественными наборами результатов в Dapper.
  2. Обработка нескольких операций с Dapper — Подробное описание работы с множественными операциями через Dapper.
  3. [V2: [Column] и [Table] Атрибуты](https://github.com/DapperLib/Dapper/issues/722) — Обсуждение на GitHub о возможных улучшениях при работе с несколькими запросами в Dapper.
  4. Запрос возвращает неожиданные значения — Сравнение скорости выполнения простого SQL-запроса и запроса через Dapper на Stack Overflow.