J'exécute une procédure stockée en utilisant QueryMultiple
pour renvoyer plusieurs ensembles de données.QueryMultiple Résultat Set Order
var gridReader = db.QueryMultiple("sp",
parameters,
commandType: CommandType.StoredProcedure);
Je peux très facilement obtenir chaque jeu étant donné que je sais que l'ordre dans lequel ils reviendront dans.
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>();
Cependant, je suis dans une situation où l'ordre reviendra en mai changer. Un autre développeur pourrait décider de changer la commande pour une raison quelconque. La procédure stockée devient maintenant ceci:
SELECT * FROM dbo.Set1;
SELECT * FROM dbo.Set3;
SELECT * FROM dbo.Set2;
Comment puis-je gérer cela?
Ma tentative initiale consistait à itérer chaque grille en vérifiant les noms des colonnes. Cela a semblé bien fonctionner au début, mais je n'ai pas réussi à comprendre comment projeter la grille dans une classe, en plus de définir manuellement chaque champ. La principale raison pour laquelle j'utilise Dapper est qu'il peut le faire pour moi.
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")) { }
}
Ma deuxième idée était de lire chaque grille dans une classe, vérifiez les champs uniques de la classe pour les valeurs NULL/valeurs par défaut, et d'essayer la classe suivante si le test a échoué. Cela ne fonctionnera évidemment pas bien. .Read()
renverra la grille suivante. Cette solution exigerait que je puisse lire la même grille encore et encore.
Merci de me pointer dans la bonne direction! Je pensais que j'allais avoir besoin de 'GetRowParser' d'une façon ou d'une autre mais je n'arrivais pas à le comprendre. Combiner cela avec un SqlDataReader a fait l'affaire. –
Vous êtes les bienvenus :) Bravo! – davmos