2009-10-27 49 views
10

Me gustaría convertir una DataTable a IEnumerable<> de Dictionary<string, object>. He intentado lo siguiente consulta LINQ,¿Cómo puedo convertir un DataTable a un IEnumerable <Dictionary <string, object >>?

from DataRow row in ds.Tables[0].AsEnumerable() 
let rowDictionary = new Dictionary<string, object>() 
from DataColumn column in row.Table.Columns.Cast<DataColumn>() 
select rowDictionary.Add(column.ColumnName, row[column]).ToArray(); 

pero me sale el siguiente error:

error CS1943: An expression of type 
'System.Collections.Generic.IEnumerable<System.Data.DataColumn>' is not 
allowed in a subsequent from clause in a query expression with source type 
'System.Data.EnumerableRowCollection<AnonymousType#1>'. Type inference 
failed in the call to 'SelectMany'. 

Sé que puedo fuerza bruta esto con un bucle, pero parece que algo que debería ser capaz de hacer en LINQ. ¡Gracias de antemano por cualquier ayuda!

Respuesta

10

supongo que lo que quiere es un diccionario para cada columna mapeo fila de valor:

var dt = new DataTable(); 

var columns = dt.Columns.Cast<DataColumn>(); 
dt.AsEnumerable().Select(dataRow => columns.Select(column => 
        new { Column = column.ColumnName, Value = dataRow[column] }) 
       .ToDictionary(data => data.Column, data => data.Value)); 
+0

que funcionaba, pero por qué no hizo el trabajo sintaxis de la consulta? – GuyBehindtheGuy

+1

No recibí el mismo error que usted, pero seleccione debe tener un objeto para seleccionar y no una acción (a menos que la acción devuelva el objeto). Dictionary.Add devuelve * void *, por lo tanto no puede ser un argumento de selección. – Elisha

+0

¿Por qué usar 'columns.Select' para un objeto nuevo, y luego' .ToDictionary' en ese objeto, en lugar de '' ToDictionary' llamar directamente? – palswim

7

Aquí es una manera de hacerlo en el formato LINQ

 var registerdataVerify = (from o in dt.AsEnumerable() 
            select new 
            {           
             DataDef =o["shortName"].ToString(), 
             Value = Convert.ToInt32(o["valueDec"]) 
            }).ToDictionary(n => n.DataDef, n => n.Value); 
4

Por qué no algo más sencillo ya que tienes linq?

var dt = new DataTable(); 
var columnIndex = 0; 
var columnName = "UserID"; 

var Dict = dt.AsEnumerable().ToDictionary(_ 
      row => row(columnName), _ 
      row => row(columnIndex)); 

Se hace aún más fácil si se trabaja con conjuntos de datos de tipo fuerte:

var dt = new dsData.UsersDataTable(); 

var Dict = dt.ToDictionary(dr => dr.UserName, dr => dr.UserID); 
Cuestiones relacionadas