2009-10-27 12 views
10

मैं Dictionary<string, object> के 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(); 

कोशिश की, लेकिन मैं निम्नलिखित त्रुटि मिलती है:

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 में करो। किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद!

उत्तर

10

मुझे लगता है कि क्या आप चाहते हैं मूल्य के लिए प्रत्येक पंक्ति मानचित्रण स्तंभ के लिए एक शब्दकोश है:

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

यही काम किया, लेकिन क्यों क्वेरी सिंटैक्स काम नहीं किया? – GuyBehindtheGuy

+1

मुझे आपके जैसा ही त्रुटि नहीं मिली, लेकिन चयन करने के लिए कोई ऑब्जेक्ट होना चाहिए, न कि कार्रवाई (जब तक कि क्रिया ऑब्जेक्ट न करे)। शब्दकोश। रिटर्न * शून्य * जोड़ें, क्योंकि यह एक चुनिंदा तर्क नहीं हो सकता है। – Elisha

+0

एक नई ऑब्जेक्ट में 'कॉलम। चयन करें' का उपयोग क्यों करें, और उसके बाद उस 'ऑब्जेक्ट' पर '.oDictionary'' के बजाय सीधे 'कॉल करें' का उपयोग क्यों करें? – 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); 
संबंधित मुद्दे