Несколько результатов & amp; множественное отображение с использованием Dapper ORM в той же хранимой процедуре в C # [дубликат]

62
задан casperOne 29 January 2015 в 20:00
поделиться

3 ответа

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

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

61
ответ дан Andomar 22 August 2018 в 07:18
поделиться
  • 1
    Этот ответ выиграл бы от примера или ссылки более подробно. – Trevor.Screws 13 November 2017 в 22:18

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

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
7
ответ дан Arun Prasad E S 22 August 2018 в 07:18
поделиться
  • 1
    Oracle поддерживает QueryMultiple или QueryMultipleAsync – Umar Topia 2 August 2017 в 18:56
  • 2
    Но как он узнает, какую категорию отображать? В первый раз, когда вы вызываете Read pull из первого возвращаемого набора результатов? – Yojin 15 August 2018 в 19:29

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);
99
ответ дан Sam Saffron 22 August 2018 в 07:18
поделиться
  • 1
    Примечание для будущих читателей: QueryMultiple не поддерживает Oracle, или, скорее, Oracle не поддерживает QueryMultiple. См. stackoverflow.com/questions/1062569/… – Charles Burns 13 February 2014 в 18:47
  • 2
    Коммуникации за то, что вы застряли с использованием Oracle. – Pure.Krome 6 April 2016 в 07:28
  • 3
    отлично! есть ли какие-либо оговорки, которые нужно отслеживать? Также есть данные, полученные за один раз? – scgough 21 October 2016 в 12:08
  • 4
    поддерживает ли это многопоточность для параллельного чтения с мульти-считывателя? – barakcaf 7 March 2018 в 11:26