2011-05-29 1 views
23

Je tire un objet Dapper FastExpando et je souhaite pouvoir référencer les noms de colonne dynamiquement au moment de l'exécution plutôt qu'à la conception/à la compilation. Donc, je veux être en mesure de faire ce qui suit:Existe-t-il un moyen d'accéder aux colonnes d'un Dapper FastExpando via une chaîne ou un index?

var testdata = conn.Query("select * from Ride Where RiderNum = 21457"); 

Je veux être en mesure de faire ce qui suit:

foreach(var row in testdata) { 
    var Value = row["PropertyA"]; 
} 

Je comprends que je peux faire:

var Value = row.PropertyA; 

mais Je ne peux pas le faire puisque le nom de la propriété dont je vais avoir besoin ne sera pas connu avant l'exécution.

La réponse de this SO Question ne fonctionne pas. Je reçois toujours la même exception Target Invocation. Donc ...

Y at-il un moyen de faire ce que je veux faire avec un Dapper FastExpando?

+0

Alors que la réponse choisie ne fonctionnerait pas pour « cette question SO » , il y avait une réponse à cette question qui le ferait. http://stackoverflow.com/questions/4939508/get-value-of-c-dynamic-property-via-string/5738983#5738983 – jbtule

Répondre

32

Bien sûr, il est en fait beaucoup plus facile que: « ou de l'indice »

var sql = "select 1 A, 'two' B"; 
var row = (IDictionary<string, object>)connection.Query(sql).First(); 
row["A"].IsEqualTo(1); 
row["B"].IsEqualTo("two"); 
+0

Je me trouve toujours en train d'utiliser 'FirstOrDefault()' et je dois encore vérifier si la ligne est null avant d'essayer d'accéder à l'index de ligne. Est-il possible d'essayer d'extraire une valeur de colonne ou une ligne spécifique, ou de renvoyer une valeur par défaut si elle n'existe pas? – crush

1

En ce qui concerne la partie du titre - Je avais besoin d'accéder aux résultats par index depuis les noms de colonnes qui sont rendus parfois changé, de sorte que vous pouvez utiliser une variation de la réponse de Sam Safran comme ceci:

var sql = "select 1, 'two'"; 
var row = (IDictionary<string, object>)connection.Query(sql).First(); 
row.Values.ElementAt(0).IsEqualTo(1); 
row.Values.ElementAt(1).IsEqualTo("two"); 
Questions connexes