Dapper Mehr‑Anweisungs‑Operationen QueryMultiple
QueryMultiple(): Führt mehrere SQL‑Abfragen über eine einzelne Verbindung aus und liefert mehrere Ergebnismengen auf einmal zurück.- Trenne mehrere SQL‑Anweisungen mit einem Semikolon
;. - Rückgabetyp ist
GridReader. Mit.Read<T>()liest du jede Ergebnismenge nacheinander in der vorgegebenen Reihenfolge. - Vorteil: Es wird nur eine einzige Datenbankverbindung aufgebaut, was den Netzwerkaufwand bei mehreren Abfragen senkt.
Beispiel
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))
{
// Mehrere SQL‑Anweisungen mit Semikolon trennen
string sql = "SELECT * FROM Customers; SELECT * FROM Book;";
// Multi‑Ergebnis‑Reader abrufen
var multiReader = db.QueryMultiple(sql);
// Lesen in der Reihenfolge der SQL‑Anweisungen
IEnumerable<Customers> customerList = multiReader.Read<Customers>();
IEnumerable<Book> bookList = multiReader.Read<Book>();
multiReader.Dispose(); // Reader‑Ressourcen freigeben
}
Console.ReadKey();
}
}
}Code-Sprache: C# (cs)
- Die Lesereihenfolge muss exakt mit der SQL‑Reihenfolge übereinstimmen
Die zuerst geschriebene SELECT‑Anweisung muss zuerst gelesen werden, falsche Reihenfolge löst Fehler aus. - Rufe Read nicht öfter auf als es Ergebnismengen gibt.
- Bei MySQL prüfe, ob Mehrfach‑Anweisungen in der Verbindungszeichenfolge aktiviert sind (standardmäßig meist aktiv).
QueryMultipleeignet sich nur für SELECT‑Abfragen. Sei vorsichtig bei gemischtem INSERT / UPDATE / DELETE, nutze stattdessen besser Transaktionen.
Mehr‑Anweisungs‑Abfrage mit Parametern
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-Sprache: C# (cs)
Mehr‑Anweisungs‑Operationen
Previous: IN‑Abfrage