Ответ 1
Вы пробовали метод QueryMultiple
? В нем говорится, что он должен:
Выполнить команду, которая возвращает множество наборов результатов и доступ к ним в свою очередь,
Есть ли способ использовать 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>
, который может обрабатывать множественное отображение).
Как я могу разбить эту строку на два объекта?
Вы пробовали метод 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);
Множественный набор результатов. (Я думаю, что Oracle не имеет множественного запроса, из-за соображений безопасности).
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