2009-10-27 22 views
10

Mi piacerebbe convertire un DataTable in un di Dictionary<string, object>. Ho provato la seguente query LINQ,Come posso convertire un DataTable in 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(); 

ma ottengo il seguente errore:

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'. 

So che posso forza bruta questo con un ciclo, ma sembra che qualcosa che dovrei essere in grado di fare in LINQ. Grazie in anticipo per qualsiasi aiuto!

risposta

10

Suppongo che ciò che si vuole è un dizionario per ogni colonna mappatura fila al valore:

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

che ha funzionato, ma perché non ha fatto il lavoro sintassi di query? – GuyBehindtheGuy

+1

Non ho ricevuto lo stesso errore, ma selezionare deve avere un oggetto da selezionare e non un'azione (a meno che l'azione non restituisca l'oggetto). Dictionary.Add restituisce * void *, quindi non può essere un argomento select. – Elisha

+0

Perché usare 'columns.Select' su un nuovo oggetto e quindi su' .ToDictionary' su quell'oggetto, piuttosto che su una chiamata '.ToDictionary'? – palswim

7

Ecco un modo lo faccio nel 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

Perché non qualcosa di più semplice visto che hai linq?

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

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

Essa diventa ancora più facile se si sta lavorando con dataset fortemente tipizzato:

var dt = new dsData.UsersDataTable(); 

var Dict = dt.ToDictionary(dr => dr.UserName, dr => dr.UserID); 
Problemi correlati