使用Dapper.NET实现一次数据库交互中执行多个SQL语句

60

在 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);
}

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

2个回答

107

是的,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();
}     

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

注意:Dapper创始人Sam Saffron在使用QueryMultiple进行此操作的详细说明和代码示例已发布。

更新:我添加了来自Marc的重要评论

注意:从1.5左右(在alpha构建中稍早些)开始,有一个ReadSingle()方法,可能比Read().Single()更方便和高效


16
你这里的东西非常理想。 - Marc Gravell
6
注意:从1.5左右版本(在alpha版本中稍早些)开始,有一个ReadSingle<T>()方法,可能比Read<T>().Single()更方便和有效。 - Marc Gravell
5
通过这种方式,您可以减少应用程序服务器和数据库服务器之间的网络调用次数,从而缩短响应时间。在我所工作的项目中,我们需要在给定视图中至少获得6个结果集。因此,节省5个网络调用非常好。 - It's a trap
这似乎在最新版本中出现了问题...我正在寻找解决方法。 - Dylan Hayes
你如何为每个语句添加WHERE子句? - Nick Bonilla
显示剩余3条评论

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);

谢谢!我正在比较许多类似的存储过程的结果,包括性能调优和未调优的。这些过程可能会返回多个结果集,但我无法获取所有结果集。在任何示例中都没有看到IsConsumed标志,因此我无法迭代它们并收集所有结果。感谢您提供的代码示例。 - Brikesh Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接