Dapper 多语句操作 QueryMultiple
QueryMultiple():一条连接执行多条查询SQL,一次性返回多个结果集。- SQL多条语句使用分号
;分隔。 - 返回类型
GridReader,调用.Read<T>()按顺序依次读取每一张表的数据。 - 优势:只建立一次数据库连接,减少多次查询网络开销。
例子
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))
{
// 多条SQL使用分号隔开
string sql = "SELECT * FROM Customers; SELECT * FROM Book;";
// 获取多结果读取器
var multiReader = db.QueryMultiple(sql);
// 按SQL书写顺序依次读取
IEnumerable<Customers> customerList = multiReader.Read<Customers>();
IEnumerable<Book> bookList = multiReader.Read<Book>();
multiReader.Dispose(); // 释放读取器资源
}
Console.ReadKey();
}
}
}Code language: C# (cs)
- 读取顺序必须和SQL顺序严格一致
先写的SELECT必须先Read,顺序错乱会报错。 - 不要多次Read超出SQL结果集数量。
- MySQL需要确认连接字符串开启多语句支持(一般默认开启)。
QueryMultiple只适合查询SELECT;增删改混合SQL慎用,推荐使用事务。
带参数多语句查询
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)
Previous: IN查询
Next: JOIN 多表关联查询