Gibt es eine Möglichkeit, Dapper.NET mit gespeicherten Prozessen zu verwenden, die mehrere Ergebnismengen zurückgeben?
In meinem Fall ist die erste Ergebnismenge eine einzelne Zeile mit einer einzelnen Spalte. Wenn dies 0
der Fall ist, war der Aufruf erfolgreich und die zweite Ergebnismenge enthält die tatsächlichen Datenzeilen / -spalten. (und wenn es nicht Null war, ist ein Fehler aufgetreten und es wird keine zweite Ergebnismenge bereitgestellt)
Gibt es eine Chance, dies mit Dapper.NET zu erledigen? Bisher bekomme ich nur diese Single zurück 0
- aber nichts weiter.
Update: OK, es funktioniert einwandfrei - solange die Ergebnismenge Nr. 2 ist eine Einheit:
Dapper.SqlMapper.GridReader reader =
_conn.QueryMultiple("sprocname", dynParams,
commandType: CommandType.StoredProcedure);
int status = reader.Read<int>().FirstOrDefault();
MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault();
Jetzt habe ich noch eine weitere Anforderung.
Dappers Multi-Mapping (Aufteilen einer einzelnen von SQL Server zurückgegebenen Zeile in zwei separate Entitäten) für diese zweite Ergebnismenge scheint noch nicht unterstützt zu werden (zumindest scheint es keine Überlastung zu geben .Read<T>
, die damit umgehen kann Multi-Mapping).
Wie kann ich diese Zeile in zwei Entitäten aufteilen?
Antworten:
Haben Sie die
QueryMultiple
Methode ausprobiert ? Es heißt, es sollte:Sie müssen diese using-Anweisung hinzufügen, um QueryMultiple zu aktivieren.
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); */
quelle
QueryMultiple
unterstützt die Fähigkeit, mit mehreren Ergebnismengen umzugehen. Die einzige Designeinschränkung, die wir hinzugefügt haben, war das vollständige Deaktivieren der Pufferung für den Grid Reader. Dies bedeutet, dass die gesamte API gestreamt wird .Im einfachsten Fall können Sie verwenden:
var grid = connection.QueryMultiple("select 1 select 2"); grid.Read<int>().First().IsEqualTo(1); grid.Read<int>().First().IsEqualTo(2);
In dem etwas anspruchsvolleren Fall können Sie verrückte Sachen wie diese machen:
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);
Sie müssen diese using-Anweisung hinzufügen, um QueryMultiple zu aktivieren.
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); */
quelle
Mehrere Ergebnismengen.
Sie müssen diese using-Anweisung hinzufügen, um QueryMultiple zu aktivieren.
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); */
Gespeicherte Prozedur:
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
quelle
.ToList()
? Ich sehe, dass sowohl Sie als auch @Sam Saffron dies in Ihren Codebeispielen getan haben. Hat dies Auswirkungen auf die Anzahl der Hin- und Rückfahrten oder die Menge der zurückgegebenen Daten?