如何将DataTable转换为IEnumerable<Dictionary<string, object>>?

11

我想将一个 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个回答

11

我假设你想要为每一行创建一个将列映射到值的字典:

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

1
我没有遇到和你一样的错误,但是select必须有一个对象来选择而不是一个动作(除非该动作返回对象)。Dictionary.Add返回void,因此它不能作为select参数。 - Elisha
为什么要使用 columns.Select 创建一个新对象,然后在该对象上调用 .ToDictionary,而不是直接调用 .ToDictionary - palswim

7

这是一种用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

既然你已经使用了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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接