Ich führe eine gespeicherte Prozedur mit QueryMultiple
, um mehrere Datensätze zurückgeben.QueryMultiple Result Set Reihenfolge geändert
var gridReader = db.QueryMultiple("sp",
parameters,
commandType: CommandType.StoredProcedure);
ich sehr leicht jeden Satz gegeben bekommen kann ich die Reihenfolge weiß, dass sie kommen wieder in.
SELECT * FROM dbo.Set1;
SELECT * FROM dbo.Set2;
SELECT * FROM dbo.Set3;
var set1 = gridReader.Read<Set1>();
var set2 = gridReader.Read<Set2>();
var set3 = gridReader.Read<Set3>();
Allerdings bin ich in einer Situation, in der Reihenfolge, wie sie wird im Mai wiederkommen. Ein anderer Entwickler könnte entscheiden, die Bestellung aus welchem Grund auch immer zu ändern. Die gespeicherte Prozedur lautet nun:
SELECT * FROM dbo.Set1;
SELECT * FROM dbo.Set3;
SELECT * FROM dbo.Set2;
Wie kann ich damit umgehen?
Mein erster Versuch war es, jedes Gitter zu iterieren und die Spaltennamen zu überprüfen. Dies schien zunächst gut zu funktionieren, aber ich war nicht in der Lage herauszufinden, wie ich dann das Raster in eine Klasse projizieren sollte, abgesehen von der manuellen Einstellung jedes Feldes. Der Hauptgrund, warum ich Dapper benutze, ist, dass es das für mich tun kann.
while (true)
{
var grid = gridReader.Read();
IDictionary<string, object> row = grid.FirstOrDefault();
if (row == null)
break;
if (row.Keys.Contains("Set1_UniqueColumnName"))
{
// Need something like grid.Read<Set1>();
}
else if (row.Keys.Contains("Set2_UniqueColumnName")) { }
else if (row.Keys.Contains("Set3_UniqueColumnName")) { }
}
Meine zweite Idee war jedes Gitter in eine Klasse zu lesen, überprüfen Sie die einzigartigen Felder der Klasse für Nullen/Standardwerte, und versuchte, die nächste Klasse, wenn der Test nicht bestanden. Das wird natürlich nicht funktionieren. .Read()
wird das nächste Ergebnisraster zurückgeben. Diese Lösung würde erfordern, dass ich das gleiche Raster immer wieder lesen könnte.
Danke mich in die richtige Richtung für den Hinweis! Ich dachte, ich würde 'GetRowParser' irgendwie brauchen, aber ich konnte es nicht richtig herausfinden. Die Kombination mit einem SqlDataReader hat es geschafft. –
Gern geschehen :) Gut gemacht! – davmos