【问题标题】:How can I convert a DataTable to an IEnumerable<Dictionary<string, object>>?如何将 DataTable 转换为 IEnumerable<Dictionary<string, object>>?
【发布时间】:2009-10-27 20:56:50
【问题描述】:

我想将 DataTable 转换为 IEnumerable&lt;&gt;Dictionary&lt;string, object&gt;。我尝试了以下 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 中执行的操作。提前感谢您的帮助!

【问题讨论】:

    标签: linq datatable


    【解决方案1】:

    我假设你想要的是每行映射列到值的字典:

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

    【讨论】:

    • 我没有得到和你一样的错误,但是 select 必须有一个要选择的对象而不是一个动作(除非动作返回对象)。 Dictionary.Add 返回 void,因此它不能是选择参数。
    • 为什么对新对象使用columns.Select,然后对该对象使用.ToDictionary,而不是直接调用.ToDictionary
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多