Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 如何将数据表转换为IEnumerable<;字典<;字符串,对象>>;?_Linq_Datatable - Fatal编程技术网

Linq 如何将数据表转换为IEnumerable<;字典<;字符串,对象>>;?

Linq 如何将数据表转换为IEnumerable<;字典<;字符串,对象>>;?,linq,datatable,Linq,Datatable,我想将数据表转换为字典的IEnumerable。我尝试了以下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.Colum

我想将数据表转换为
字典的
IEnumerable
。我尝试了以下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();
来自ds.Tables[0].AsEnumerable()中的DataRow行的

让rowDictionary=newDictionary()
来自row.Table.Columns.Cast()中的DataColumn列
选择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'.
错误CS1943:类型为的表达式
“System.Collections.Generic.IEnumerable”不是
在源类型为的查询表达式的后续from子句中允许
“System.Data.EnumerablerRowCollection”。类型推断
调用“SelectMany”失败。

我知道我可以用一个循环来强制执行,但这似乎是我应该在LINQ中能够做的事情。提前感谢您的帮助

我假设您需要的是一个字典,用于将列映射到值的每一行:

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));
var dt=new DataTable();
var columns=dt.columns.Cast();
dt.AsEnumerable().Select(数据行=>columns.Select(列=>
新{Column=Column.ColumnName,Value=dataRow[Column]})
.ToDictionary(data=>data.Column,data=>data.Value));

以下是我使用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);

既然你有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);

我没有得到与您相同的错误,但是select必须有一个要选择的对象,而不是一个操作(除非操作返回对象)。Dictionary.Add返回void,因此它不能是select参数。为什么要使用
列。选择新对象的
,然后在该对象上选择
.ToDictionary
,而不是直接调用
。ToDictionary