2009-05-26 26 views

Respuesta

51

Puede utilizar LINQ:

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

Tu respuesta parece interesante, pero la necesito en VB.NET, y no sé cómo traducir la última parte: .ToDictionary (reader.GetName, reader.GetValue). Cualquier sugegstion? Gracias – bzamfir

+1

@bzamfir: Necesitas 'AddressOf'. – SLaks

+5

Soy cauteloso de saltar en el carro de linq-is-everything, pero esto es espléndido. –

24

más fácil que esto ?:

// 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)); 
} 

todavía no estoy seguro de por qué se necesita este particular transformación de un tipo de colección a otra.

+4

Como una respuesta a su pregunta: si uno necesita para almacenar en caché los resultados, parece más prudente para almacenar en caché el copia del diccionario De lo contrario, terminará con muchos lectores abiertos – Toad

+1

@Toad One puede usar una DataTable si desea almacenar en caché los resultados. 'MyDataTable.Load (dr);' –

+0

@CadeRoux una DataTable leería el conjunto de resultados completo en lugar de una sola fila no? –

0

GetValues ​​método acepta & pone en, todos los valores en una matriz de 1D.
¿Eso ayuda?

1

ya es un IDataRecord.

que debe darle casi el mismo acceso (con llave) como un diccionario. Dado que las filas generalmente no tienen más que unas cuantas columnas, el rendimiento de las búsquedas no debería ser tan diferente. La única diferencia importante es el tipo de "carga útil", e incluso allí su diccionario debería usar un objeto para el tipo de valor, por lo que doy la ventaja a IDataRecord.

+6

Esto es útil cuando desea que el resultado de una consulta esté disponible después de haber liberado la conexión. Los objetos DataReader están intrínsecamente ligados a la conexión con la que se crearon. – sholsinger

2

me encontré con esta pregunta en 09/03/2016 y terminó usando la respuesta proporcionada por SLaks. Sin embargo, tenía que modificar ligeramente a:

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

me encontré con la orientación de esta cuestión StackOverflow: convert dataReader to Dictionary

Cuestiones relacionadas