Operaciones de múltiples sentencias en Dapper: QueryMultiple
QueryMultiple(): ejecuta varias consultas SQL con una única conexión y devuelve varios conjuntos de resultados de una sola vez.- Separa las sentencias SQL con un punto y coma
;. - El tipo devuelto es
GridReader. Usa.Read<T>()para leer cada conjunto de datos en el mismo orden de escritura. - Ventaja: solo se abre una conexión a base de datos, reduciendo la sobrecarga de red de múltiples consultas.
Ejemplo
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))
{
// Varias sentencias SQL separadas por punto y coma
string sql = "SELECT * FROM Customers; SELECT * FROM Book;";
// Obtener el lector de múltiples resultados
var multiReader = db.QueryMultiple(sql);
// Leer siguiendo el orden de las sentencias SQL
IEnumerable<Customers> customerList = multiReader.Read<Customers>();
IEnumerable<Book> bookList = multiReader.Read<Book>();
multiReader.Dispose(); // Liberar recursos del lector
}
Console.ReadKey();
}
}
}Lenguaje del código: C# (cs)
- El orden de lectura debe coincidir exactamente con el orden de las sentencias SQL
El primer SELECT debe leerse primero; si cambias el orden obtendrás errores. - No llames a Read más veces que conjuntos de resultados existentes.
- Con MySQL verifica que la cadena de conexión tenga habilitado el soporte para múltiples sentencias (suele estar activado por defecto).
QueryMultiplesirve principalmente para consultas SELECT. Ten cuidado con sentencias mixtas INSERT‑UPDATE‑DELETE; se recomienda usar transacciones.
Consulta multi‑sentencia con 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>();Lenguaje del código: C# (cs)
Operaciones de múltiples sentencias
Previous: Consulta IN