Dapper.NET и сохраненный proc с несколькими результирующими наборами
есть ли способ использовать Dapper.NET с сохраненными процессорами, которые возвращают несколько результирующих наборов?
в моем случае первый результирующий набор-это одна строка с одним столбцом; если это 0 тогда вызов был успешным, и второй результирующий набор будет содержать эти фактические строки/столбцы данных. (и если он был ненулевым, произошла ошибка, и второй результирующий набор не будет предоставлен)
любой шанс справиться с этим Dapper.NET до сих пор, я только когда-нибудь получу обратно этот сингл 0 - но не более того.
обновление: хорошо, он отлично работает - пока результирующий набор № 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> что справлюсь мульти-отображение).
как я могу разделить эту строку на две сущности?
3 ответов:
вы пробовали
QueryMultipleспособ? Он говорит, что должен:выполнить команду, которая возвращает несколько результирующих наборов и доступ к каждому в свою очередь
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);
несколько результирующих наборов.
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();хранимая процедура:
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
Comments