Dapper.NET и сохраненный процесс с несколькими наборами результатов - PullRequest
73 голосов
/ 11 июня 2011

Есть ли способ использовать 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 ]

113 голосов
/ 14 июня 2011

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 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); */
67 голосов
/ 11 июня 2011

Вы пробовали метод QueryMultiple?Он говорит, что должен:

Выполнить команду, которая возвращает несколько результирующих наборов, и обращаться к каждому из них по очереди

Вам нужно будет добавить это, используя оператор для включения 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); */
12 голосов
/ 10 апреля 2017

Множественный набор результатов.

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 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
...