Как я могу преобразовать DataTable в IEnumerable <Dictionary <string, object >>? - PullRequest
10 голосов
/ 27 октября 2009

Я хотел бы преобразовать DataTable в IEnumerable<> из Dictionary<string, object>. Я попробовал следующий запрос LINQ,

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

но я получаю следующую ошибку:

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

Я знаю, что могу перебрать это с помощью цикла, но похоже, что я должен быть в состоянии сделать в LINQ. Заранее спасибо за любую помощь!

Ответы [ 3 ]

10 голосов
/ 28 октября 2009

Я предполагаю, что вам нужен словарь для каждого столбца отображения строк в значение:

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));
7 голосов
/ 13 апреля 2011

Вот способ, которым я делаю это в формате 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 голосов
/ 18 ноября 2011

Почему бы не что-нибудь попроще, так как у вас есть linq?

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

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

Это становится еще проще, если вы работаете со строго типизированными наборами данных:

var dt = new dsData.UsersDataTable();

var Dict = dt.ToDictionary(dr => dr.UserName, dr => dr.UserID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...