C# 使用Dapper.NET在一次往返中使用多个SQL语句
ADO.NET中有一个很好的功能,允许您在一次往返中向数据库发送多个SQL语句,并接收所有语句的结果:C# 使用Dapper.NET在一次往返中使用多个SQL语句,c#,sql,.net,sql-server,dapper,C#,Sql,.net,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
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中是否有类似的功能?是的,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();
}
stringquery=@“从表A中选择COUNT(*);
从表B中选择计数(*);
使用(var multi=connection.QueryMultiple(query,null))
{
int countA=multi.Read().Single();
int countB=multi.Read().Single();
}
根据这一点,这是在一个批处理中执行多个查询的理想方式
注意:Dapper creator已经发布了一个关于使用QueryMultiple
来完成此任务的帖子
更新:我添加了Marc的重要评论
注意:从1.5-ish(alpha版本稍早)开始,有一个
ReadSingle()方法,它可能比
Read().Single()
var grid=connection.QueryMultiple(“
从表A中选择计数(*)
从表B中选择计数(*)
从表C中选择计数(*);
var lstreult=新列表();
var isNext=false;
做{
var first2=info.Read().Single();
lstreult.Add(first2);
isNext=info.IsConsumed;
}
而(!isNext);
这里的内容是理想的注意:从1.5-ish(alpha版本稍早一点)开始,有一个ReadSingle()
方法可能比Read().Single()更方便、更有效。需要花一点时间来测试这些新版本。仍然是1.42。它是否适用于NET 4.0?@Shil这样可以减少应用程序服务器和数据库服务器之间的网络调用数量。所以总体响应时间会更好。在这里,我工作的地方,我们需要在一个给定的视图中至少6个结果集。因此,保存5个网络呼叫是非常好的这似乎是打破在最新版本。。。我正在寻找修复方法。谢谢!!我正在比较许多类似存储过程的结果。性能已调整,但未调整。过程可能返回多个结果集。我没能把它们都弄到手。我在任何示例中都没有看到IsConsumed标志。这就是为什么我不能迭代它们并收集它们。谢谢你的代码示例
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);