2017-06-28 1 views
1

J'ai un sproc qui renvoie un nombre variable de colonnes avec différents noms de colonnes en fonction du paramètre d'entrée qui lui est attribué. Par exemple, si l'entrée est 3, sproc renvoie 3 colonnes et si l'entrée est 5, elle renvoie 5. (Pas sûr du paramètre d'entrée qui pourrait être donné)Lit les noms de colonnes en fonction de l'index d'une variable dynamique

J'utilise dapper pour intégrer mon sproc dans une application C# et j'utilise dynamic comme type de retour comme ci-dessous.

dynamic returnValue = connection.Query<dynamic>("sproc and inputs") 

Quelqu'un peut-il me guider sur la façon de lire les colonnes de la variable dynamique?

L'utilisation de returnValue[0].col1, returnValue[0].col2 fonctionne mais je ne suis pas sûr du nombre de colonnes à interroger.

Existe-t-il un moyen de lire des colonnes comme returnValue[0]["c1"] ou de manière plus simple pour que je puisse faire une boucle pour obtenir toutes les colonnes en fonction du paramètre d'entrée?

Répondre

1

Le résultat de l'appel connection.Query() peut être converti en un IEnumerable<IDictionary<string, object>> qui vous permettra de parcourir les résultats ou d'y accéder à l'aide d'une clé d'index et de nom de colonne. Par exemple:

IEnumerable<IDictionary<string, object>> results; 

string sql = @"select 'a' as col1, 'b' as col2, 'c' as col3, 'd' as col4 
       union 
       select 'w' as col1, 'x' as col2, 'y' as col3, 'z' as col4"; 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    results = connection.Query(sql) as IEnumerable<IDictionary<string, object>>; 
} 

//we need to use ElementAt as we have an Enumerable but we could ToList it if required 
Console.WriteLine(results.ElementAt(0)["col1"]); 

//we can iterate the rows 
foreach (var row in results) 
{ 
    //then iterate the columns and get a KeyValuePair for each column 
    foreach (var col in row) 
    { 
     Console.WriteLine("{0} {1}", col.Key, col.Value); 
    } 
} 

qui imprime:

un
COL1 un
col2 b
col3 c
col4 d
col1 w
col2 x
col3 y
col4 z

+0

Merci @petelids. Je vais certainement essayer. –

+0

Merci @G_S, laissez-moi savoir comment vous allez. – petelids

+0

J'ai été en mesure d'obtenir les résultats en utilisant le code ci-dessus. Merci beaucoup @petelids. –