2009-10-27 39 views
10

Tôi muốn chuyển đổi một DataTable thành một số IEnumerable<> của Dictionary<string, object>. Tôi đã thử các truy vấn LINQ sau,Làm cách nào tôi có thể chuyển đổi một DataTable thành một chuỗi <Dictionary <string, object >>?

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

nhưng tôi nhận được lỗi sau:

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

Tôi biết tôi có thể brute-lực lượng này với một vòng lặp, nhưng nó có vẻ như một cái gì đó tôi sẽ có thể làm trong LINQ. Cảm ơn trước sự giúp đỡ nào!

Trả lời

10

Tôi cho rằng những gì bạn muốn là một từ điển cho mỗi cột lập bản đồ hàng để giá trị:

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

Đó làm việc, nhưng tại sao không phải là công việc cú pháp truy vấn? – GuyBehindtheGuy

+1

Tôi đã không nhận được lỗi tương tự như bạn đã làm, nhưng chọn phải có một đối tượng để chọn và không phải là một hành động (trừ khi hành động trả về đối tượng). Dictionary.Add returns * void *, do đó, nó không thể là đối số được chọn. – Elisha

+0

Tại sao lại sử dụng 'columns.Select' cho một đối tượng mới, và sau đó là' .ToDictionary' trên đối tượng đó, chứ không phải là một cuộc gọi '.ToDictionary' trực tiếp? – palswim

7

Dưới đây là một cách tôi làm điều đó trong các định dạng 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

Tại sao không phải là điều đơn giản vì bạn có linq?

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

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

Nó trở nên dễ dàng hơn nếu bạn đang làm việc với các tập dữ liệu mạnh mẽ-gõ:

var dt = new dsData.UsersDataTable(); 

var Dict = dt.ToDictionary(dr => dr.UserName, dr => dr.UserID); 
Các vấn đề liên quan