Есть ли способ использовать 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
метод? В нем говорится, что он должен:Вам нужно будет добавить этот оператор 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); */
источник
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); */
источник
Множественный набор результатов.
Вам нужно будет добавить этот оператор 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
источник
.ToList()
? Я вижу, что и вы, и @Sam Saffron сделали это в своих примерах кода. Влияет ли это на количество циклов приема-передачи или объем возвращаемых данных?