2009-10-27 15 views
10

Chciałbym przekonwertować DataTable na IEnumerable<> z Dictionary<string, object>. Próbowałem następujące kwerendy LINQ,Jak mogę przekonwertować DataTable na 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(); 

ale pojawia się następujący błąd:

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

wiem może brute-force to z pętlą, ale wydaje się, że coś powinienem móc robić w LINQ. Z góry dziękuję za pomoc!

Odpowiedz

10

Przypuszczam, że to, co chcesz, to słownik dla każdej kolumny odwzorowania rzędu do wartości:

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

To działało, ale dlaczego nie zrobił praca składni zapytania? – GuyBehindtheGuy

+1

Nie otrzymałem tego samego błędu, co ty, ale wybierz musi mieć obiekt do wybrania, a nie działanie (chyba, że ​​akcja zwraca obiekt). Dictionary.Add zwraca * void *, dlatego nie może być argumentem select. – Elisha

+0

Po co używać 'columns.Select' do nowego obiektu, a następnie' .ToDictionary' na tym obiekcie, zamiast wywoływać '.ToDictionary' bezpośrednio? – palswim

7

Oto sposób mogę to zrobić w formacie 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

Dlaczego nie coś prostsze skoro masz linq?

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

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

Staje się jeszcze łatwiejsze, jeśli pracujesz z silnie wpisany zestawów danych:

var dt = new dsData.UsersDataTable(); 

var Dict = dt.ToDictionary(dr => dr.UserName, dr => dr.UserID); 
Powiązane problemy