Comment convertir un DataTable en IEnumerable?
j'aimerais convertir un DataTable en IEnumerable<>
Dictionary<string, object>
. J'ai essayé la requête LINQ suivante,
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();
mais j'obtiens l'erreur suivante:
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'.
je sais que je peux forcer ça avec une boucle, mais ça ressemble à quelque chose que je devrais pouvoir faire à LINQ. Merci d'avance pour toute aide!
10
demandé sur
GuyBehindtheGuy
2009-10-27 23:56:50
3 réponses
je suppose que ce que vous voulez est un Dictionnaire pour chaque ligne, colonne mappage de valeur:
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));
10
répondu
Elisha
2009-10-27 22:11:05
Ici est une manière pour moi de le faire dans le 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);
7
répondu
n8CodeGuru
2011-04-19 20:05:03
Pourquoi pas quelque chose de plus simple puisque vous avez linq?
var dt = new DataTable();
var columnIndex = 0;
var columnName = "UserID";
var Dict = dt.AsEnumerable().ToDictionary( _
row => row(columnName), _
row => row(columnIndex));
Il devient encore plus facile si vous travaillez avec fortement typés:
var dt = new dsData.UsersDataTable();
var Dict = dt.ToDictionary(dr => dr.UserName, dr => dr.UserID);
4
répondu
Mike Vickers
2011-11-18 19:36:31