web-dev-qa-db-ja.com

Dapper.NETを使用した1回のラウンドトリップでの複数のSQLステートメント

ADO.NETには、複数のSQLステートメントを1回のラウンドトリップでデータベースに送信し、すべてのステートメントの結果を受け取ることができる素晴らしい機能があります。

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に同様の機能はありますか?

52
user1224129

はい、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を使用する際に コードサンプルの詳細な説明 を投稿しました。

87
Steve
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);
4
Ahmad Aghazadeh