有没有办法将Dapper.NET与返回多个结果集的存储过程一起使用?
就我而言,第一个结果集是一行,只有一列;如果它是0
则调用成功,第二个结果集将包含实际的行/列数据。 (如果它不为零,则会发生错误,并且不会提供第二个结果集)
有机会使用Dapper.NET处理这个问题吗?到目前为止,我只回到那个单0
- 但仅此而已。
更新:好的,它运行正常 - 只要结果设置为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();
现在,我有又一个要求。
Dapper的多映射(将从SQL Server返回的单行拆分为两个独立的实体)对于第二个结果集似乎尚未得到支持(至少似乎没有超载)可以处理多映射的.Read<T>
。
如何将该行拆分为两个实体?
答案 0 :(得分:110)
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);
您需要添加此using语句以启用QueryMultiple。
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); */
答案 1 :(得分:66)
您是否尝试过QueryMultiple
方法?它说它应该:
执行返回的命令 多个结果集,并访问每个 反过来
您需要添加此using语句以启用QueryMultiple。
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); */
答案 2 :(得分:12)
多个结果集。
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();
您需要添加此using语句以启用QueryMultiple。
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