Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I convert a DataTable to an IEnumerable<Dictionary<string, object>>?

Tags:

linq

datatable

I'd like to convert a DataTable to an IEnumerable<> of Dictionary<string, object>. I tried the following LINQ query,

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();

but I get the following 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'.

I know I can brute-force this with a loop, but it seems like something I should be able to do in LINQ. Thanks in advance for any help!

like image 383
GuyBehindtheGuy Avatar asked Oct 27 '09 20:10

GuyBehindtheGuy


2 Answers

I assume that what you want is a Dictionary for each row mapping column to value:

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));
like image 75
Elisha Avatar answered Sep 24 '22 21:09

Elisha


Here is a way I do it in the Linq format

       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);
like image 24
n8CodeGuru Avatar answered Sep 24 '22 21:09

n8CodeGuru