Operações com múltiplas instruções Dapper‑ QueryMultiple
QueryMultiple(): executa várias consultas SQL numa única conexão e retorna vários conjuntos de resultados de uma só vez.- Separe as instruções SQL com ponto e vírgula
;. - O tipo de retorno é
GridReader. Use.Read<T>()para ler cada conjunto de dados na ordem em que foram escritos. - Vantagem: apenas uma conexão com banco de dados é criada, reduzindo a sobrecarga de rede de várias consultas.
Exemplo
using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using Dapper;
using System.Configuration;
namespace ConsoleApp4
{
public class Customers
{
public int CustomerID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
public class Book
{
public string Title { get; set; }
}
class Program
{
static void Main(string[] args)
{
var connStr = ConfigurationManager.ConnectionStrings["CustomerConnection"].ConnectionString;
using (IDbConnection db = new MySqlConnection(connStr))
{
// Múltiplos SQL separados por ponto e vírgula
string sql = "SELECT * FROM Customers; SELECT * FROM Book;";
// Obter leitor de múltiplos resultados
var multiReader = db.QueryMultiple(sql);
// Ler na ordem das instruções SQL
IEnumerable<Customers> customerList = multiReader.Read<Customers>();
IEnumerable<Book> bookList = multiReader.Read<Book>();
multiReader.Dispose(); // Liberar recursos do leitor
}
Console.ReadKey();
}
}
}Code language: C# (cs)
- A ordem de leitura deve corresponder exatamente à ordem das instruções SQL
O primeiro SELECT tem que ser lido primeiro. Ordem incorreta causa erros. - Não chame Read mais vezes do que a quantidade de conjuntos de resultados disponíveis.
- No MySQL confirme se o suporte a múltiplas instruções está ativado na string de conexão (geralmente vem ativado por padrão).
QueryMultipleé indicado apenas para consultas SELECT. Tenha cuidado ao misturar INSERT / UPDATE / DELETE; prefira usar transações.
Consulta com múltiplas instruções e parâmetros
string sql = "SELECT * FROM student WHERE Id=@id; SELECT * FROM book WHERE Id=@id;";
using var multiReader = db.QueryMultiple(sql, new { id = 1 });
var stu = multiReader.ReadFirstOrDefault<Student>();
var book = multiReader.ReadFirstOrDefault<Book>();Code language: C# (cs)
Operações com múltiplas instruções
Previous: Consulta IN