複数の結果セットを返すストアドプロシージャでDapper.NETを使用する方法はありますか?
私の場合、最初の結果セットは単一の列と単一の行です。 0
の場合、呼び出しは成功し、2番目の結果セットにはそのデータの実際の行/列が含まれます。 (また、ゼロ以外の場合、エラーが発生し、2番目の結果セットは提供されません)
Dapper.NETでこれを処理する機会はありますか?これまでのところ、私はその単一の0
だけを取り戻していますが、それ以上のものはありません。
更新: OK、それは正常に動作します-結果セットがnoである限り。 2は単一のエンティティです。
Dapper.SqlMapper.GridReader reader =
_conn.QueryMultiple("sprocname", dynParams,
commandType: CommandType.StoredProcedure);
int status = reader.Read<int>().FirstOrDefault();
MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault();
今、私はまだ別の要件を持っています。
その2番目の結果セットのDapperのマルチマッピング(SQL Serverから返された1つの行を2つの個別のエンティティに分割する)はまだサポートされていないようです(少なくとも、.Read<T>
のオーバーロードはないようです)マルチマッピングを処理します)。
その行を2つのエンティティに分割するにはどうすればよいですか?
QueryMultiple
メソッドを試しましたか?次のように書かれています:
複数の結果セットを返すコマンドを実行し、それぞれに順番にアクセスします
QueryMultipleを有効にするには、このusingステートメントを追加する必要があります。
using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */
QueryMultiple
は、複数の結果セットを処理する機能をサポートします。追加した唯一の設計上の制限は、グリッドリーダーのバッファリングを完全に無効にすることでした。これは、API全体がストリーミングであることを意味します。
最も単純なケースでは、次を使用できます。
var grid = connection.QueryMultiple("select 1 select 2");
grid.Read<int>().First().IsEqualTo(1);
grid.Read<int>().First().IsEqualTo(2);
もう少し洗練されたケースでは、次のようなクレイジーなことができます:
var p = new DynamicParameters();
p.Add("a", 11);
p.Add("r", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
connection.Execute(@"create proc #spEcho
@a int
as
begin
select @a Id, 'ping' Name, 1 Id, 'pong1' Name
select @a Id, 'ping' Name, 2 Id, 'pong2' Name
return @a
end");
var grid = connection.QueryMultiple("#spEcho", p,
commandType: CommandType.StoredProcedure);
var result1 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
(a, b) => Tuple.Create((object)a, (object)b)).ToList();
var result2 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
(a, b) => Tuple.Create((object)a, (object)b)).ToList();
((int)(result1[0].Item1.Id)).IsEqualTo(11);
((int)(result1[0].Item2.Id)).IsEqualTo(1);
((int)(result2[0].Item1.Id)).IsEqualTo(11);
((int)(result2[0].Item2.Id)).IsEqualTo(2);
p.Get<int>("r").IsEqualTo(11);
QueryMultipleを有効にするには、このusingステートメントを追加する必要があります。
using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */
複数の結果セット。
var reader = conn.QueryMultiple("ProductSearch", param: new { CategoryID = 1, SubCategoryID = "", PageNumber = 1 }, commandType: CommandType.StoredProcedure);
var CategoryOneList = reader.Read<CategoryOne>().ToList();
var CategoryTwoList = reader.Read<CategoryTwo>().ToList();
QueryMultipleを有効にするには、このusingステートメントを追加する必要があります。
using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */
ストアドプロシージャ:
CREATE PROCEDURE [dbo].[ProductSearch]
@CategoryID as varchar(20),
@SubCategoryID as varchar(20),
@PageNumber as varchar(20)
AS
BEGIN
SELECT * FROM ProductTbl
SELECT * FROM ProductTbl
END