使用Dapper.NET在一次往返中使用多个SQL语句

use*_*129 52 .net c# sql sql-server dapper

ADO.NET中有一个很好的功能,允许您在一次往返中将多个SQL语句发送到数据库,并接收所有语句的结果:

var command = new SqlCommand("SELECT count(*) FROM TableA; SELECT count(*) FROM TableB;", connection);

using(var reader = command.ExecuteReader())
{
    reader.Read();
    resultA = reader.GetInt32(0);
    reader.NextResult();
    reader.Read();
    resultB = reader.GetInt32(0);
}
Run Code Online (Sandbox Code Playgroud)

Dapper.NET中是否有类似的功能?

Ste*_*eve 87

是的,Dapper QueryMultiple扩展可以做到这一点:

string query = @"SELECT COUNT(*) FROM TABLEA;
                 SELECT COUNT(*) FROM TABLEB";
using (var multi = connection.QueryMultiple(query, null))
{
    int countA = multi.Read<int>().Single();
    int countB = multi.Read<int>().Single();
}     
Run Code Online (Sandbox Code Playgroud)

根据Marc Gravell的说法,这是在一个批处理中执行多个查询的理想方式.

注意:Dapper创建者Sam Saffron在使用代码示例时发布了详细解释QueryMultiple.

  • 你在这里拥有的是理想的 (13认同)
  • 注意:从1.5-ish(alpha版本上的一个小耳机)有一个`ReadSingle <T>()`方法,它可能比`Read <T>()更方便和有效.Pingle()` (5认同)
  • @Shil这样可以减少应用程序服务器和数据库服务器之间的网络调用次数.因此整体响应时间会更好.在这里,我在需要至少6个结果集的地方工作.因此节省5个网络电话是非常好的 (5认同)

Ahm*_*deh 5

var grid = connection.QueryMultiple("
             SELECT COUNT(*) FROM TABLEA
             SELECT COUNT(*) FROM TABLEB
             SELECT COUNT(*) FROM TABLEC");
var lstResult = new List<int>();
var isNext = false;
do{
    var first2 = info.Read<int>().Single();
    lstResult.Add(first2);
    isNext=info.IsConsumed;
}
while (!isNext);
Run Code Online (Sandbox Code Playgroud)