Множественные SQL запросы в одной сессии с Dapper.NET
Быстрый ответ
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.
var multi = connection.QueryMultiple(sql);
var singleUser = multi.ReadSingle<User>(); // Ожидается единственная запись, иначе будет вызвано исключение
var singleOrder = multi.ReadSingleOrDefault<Order>(); // В случае отсутствия записи вернётся null
Оставайтесь на чеку! Результаты вот-вот придут
Воспользуйтесь свойством GridReader.IsConsumed
для динамической проверки доступности дополнительных наборов данных. Это защитит вас в случае, если наборы результатов не определены.
while (!multi.IsConsumed)
{
var extraResults = multi.Read();
// Обработка дополнительных данных
}
Храните и обрабатывайте — всё под вашим контролем
Будьте готовы к обработке больших объёмов данных, сохраняя результаты QueryMultiple
в коллекции.
var resultsList = new List<object>();
while (!multi.IsConsumed)
{
resultsList.Add(multi.Read());
}
Почему Dapper вне конкуренции
QueryMultiple
значительно упрощает сложные задачи путем комбинации лёгкости в использовании и высокой производительности. Этот метод стоит в числе наиболее предпочтительных альтернатив ADO.NET.
Тайные подводные камни и профессиональные советы
- Гарантировать безопасность и точность SQL-команды.
- Используйте параметризованные запросы для предотвращения SQL-инъекций.
- Придерживайтесь шаблона
using
для корректного освобождения ресурсов соединения. - Следите за производительностью своих запросов.
Визуализация
Визуализируйте выполнение нескольких SQL-запросов с помощью Dapper.NET как отправку птиц по одному маршруту полёта:
🚀 Раунд-Трип: SQL Станция А 🏷️ SELECT * FROM Customers; SQL Станция Б 🏷️ INSERT INTO Orders...; SQL Станция В 🏷️ UPDATE Inventory...
Каждая "птица" символизирует отдельный SQL-запрос:
🐦 (SELECT) 🦉 (INSERT) 🦅 (UPDATE)
В конце "полёта" все задачи выполнены эффективно:
🔁 Возвращение: [🐦 Клиенты, 🦉 Заказ подтверждён, 🦅 Инвентарь обновлён]
Вывод: Группировка операций в рамках одной транзакции экономит время и ресурсы — это подобно птицам, доставляющим несколько сообщений за один полёт.
Погружение: подгонка запросов под задачи
QueryMultiple
Dapper даёт возможность кастомизировать запросы под ваши индивидуальные потребности. Рассмотрим несколько практических случаев использования:
Получение связанных данных
Одновременная выборка данных, связанных через внешний ключ — например, заказа и его элементов:
using (var multi = conn.QueryMultiple(sql))
{
var order = multi.Read<Order>().Single();
order.Items = multi.Read<OrderItem>().ToList(); // Превосходное сочетание!
}
Сбор сводной информации и деталей
Получение статистики по клиентам и их заказам за один запрос — словно убить двух зайцев одним выстрелом!
using (var multi = conn.QueryMultiple(sql))
{
var customerStats = multi.ReadSingle<CustomerStats>();
var customerOrders = multi.Read<Order>().ToList(); // Вся информация сразу!
}
Обработка результатов на основе условий
Настройте логику обработки в зависимости от полученных результатов:
if (!multi.IsConsumed && multi.ReadSingle<int>() > 0)
{
var customerOrders = multi.Read<Order>().ToList(); // Успех!
}
Обеспечение транзакционной целостности
При использовании QueryMultiple
с транзакциями гарантируется сохранность данных:
using (var transaction = conn.BeginTransaction())
{
var multi = conn.QueryMultiple(sql, transaction: transaction);
// Здесь обрабатываем результаты
transaction.Commit(); // И закрываем процесс
}
Полезные материалы
- Тестирование программ на D на FreeBSD для компиляции на OSX — Обсуждение на Stack Overflow о работе с множественными наборами результатов в Dapper.
- Обработка нескольких операций с Dapper — Подробное описание работы с множественными операциями через Dapper.
- [V2: [Column] и [Table] Атрибуты](https://github.com/DapperLib/Dapper/issues/722) — Обсуждение на GitHub о возможных улучшениях при работе с несколькими запросами в Dapper.
- Запрос возвращает неожиданные значения — Сравнение скорости выполнения простого SQL-запроса и запроса через Dapper на Stack Overflow.