2009-05-26 9 views

risposta

51

È possibile utilizzare LINQ:

return Enumerable.Range(0, reader.FieldCount) 
       .ToDictionary(reader.GetName, reader.GetValue); 
+0

La tua risposta sembra interessante, ma ne ho bisogno in VB.NET, e non so come tradurre l'ultima parte - .ToDictionary (reader.GetName, reader.GetValue). Qualche suggezione? Grazie – bzamfir

+1

@bzamfir: è necessario 'AddressOf'. – SLaks

+5

Sono diffidente nel saltare sul carro del linq-is-everything ma questo è splendido. –

24

più facile di questo ?:

// Need to read the row in, usually in a while (opReader.Read) {} loop... 
opReader.Read(); 

// Convert current row into a dictionary 
Dictionary<string, object> dict = new Dictionary<string, object>(); 
for(int lp = 0 ; lp < opReader.FieldCount ; lp++) { 
    dict.Add(opReader.GetName(lp), opReader.GetValue(lp)); 
} 

io non sono ancora sicuro perché si avrebbe bisogno questa particolare trasformazione da un tipo di raccolta ad un altro.

+4

Come risposta alla tua domanda: se uno ha bisogno di memorizzare nella cache i risultati, sembra più saggio memorizzare nella cache il copia del dizionario. Altrimenti ci si ritrova con molti lettori aperti – Toad

+1

@Toad Uno può utilizzare un DataTable se si desidera memorizzare nella cache i risultati. 'MyDataTable.Load (dr);' –

+0

@CadeRoux un DataTable leggerà l'intero set di risultati invece di una singola riga no? –

0

Il metodo GetValues ​​accetta & inserisce tutti i valori in una matrice 1D.
Questo aiuta?

1

È già un IDataRecord.

Questo dovrebbe darvi lo stesso accesso (tramite chiave) come un dizionario. Poiché le righe in genere non hanno più di poche manciate di colonne, le prestazioni delle ricerche non dovrebbero essere così diverse. L'unica differenza importante è il tipo di "payload", e anche lì il tuo dizionario dovrebbe usare l'oggetto per il tipo di valore, quindi do il margine a IDataRecord.

+6

Questo è utile quando desideri che il risultato di una query sia disponibile dopo che hai liberato la connessione. Gli oggetti DataReader sono intrinsecamente legati alla connessione con cui sono stati creati. – sholsinger

2

mi sono imbattuto in questa domanda 2016/03/09 e finito per usare la risposta fornita da SLaks. Tuttavia, ho bisogno di modificare leggermente a:

dataRowDictionary = Enumerable.Range(0, reader.FieldCount).ToDictionary(i => reader.GetName(i), i=> reader.GetValue(i).ToString()); 

ho trovato la guida di questa domanda StackOverflow: convert dataReader to Dictionary

Problemi correlati