2013-01-20 16 views
8

मैं सी # में datatable पर LINQ क्वेरी चला रहा हूं।डेटाटेबल पर लिंक: डेटा कॉल करने योग्य में विशिष्ट कॉलम का चयन करें, पूरे टेबल

मैं पूरी पंक्ति के बजाय विशिष्ट कॉलम चुनना चाहता हूं और परिणाम datatable में दर्ज करना चाहता हूं। मैं उसे कैसे कर सकता हूँ??

मेरे कोड:

public DataTable getConversions(string c_to, string p_to) 
{ 
    var query = from r in matrix.AsEnumerable() 
       where r.Field<string>("c_to") == c_to && 
         r.Field<string>("p_to") == p_to 
       select r; 

    DataTable conversions = query.CopyToDataTable(); 
+2

"मुझे एक त्रुटि मिलती है": आपको क्या त्रुटि मिलती है? –

+1

त्रुटि है: प्रकार 'AnonymousType # 1' प्रकार को सामान्य प्रकार या विधि 'System.Data.DataTableExtensions.CopyToDataTable (System.Collections.Generic.IEnumerable ) टाइप प्रकार पैरामीटर' टी 'के रूप में उपयोग नहीं किया जा सकता है। 'AnonymousType # 1' से 'System.Data.DataRow' तक कोई अंतर्निहित संदर्भ रूपांतरण नहीं है। –

+0

संभव डुप्लिकेट [LINQ क्वेरी के साथ CopyToDataTable का उपयोग कर अपवाद?] (Http://stackoverflow.com/questions/1072120/exception-using-copytodatatable-with-linq-query) –

उत्तर

8

आप पहले से ही पहले से पता है कि कितने कॉलम के साथ अपने नए DataTable होता हैं, तो आप कुछ इस तरह कर सकते हैं:

DataTable matrix = ... // get matrix values from db 

DataTable newDataTable = new DataTable(); 
newDataTable.Columns.Add("c_to", typeof(string)); 
newDataTable.Columns.Add("p_to", typeof(string)); 

var query = from r in matrix.AsEnumerable() 
      where r.Field<string>("c_to") == "foo" && 
        r.Field<string>("p_to") == "bar" 
      let objectArray = new object[] 
      { 
       r.Field<string>("c_to"), r.Field<string>("p_to") 
      } 
      select objectArray; 

foreach (var array in query) 
{ 
    newDataTable.Rows.Add(array); 
} 
+0

वह चाल करेगा। धन्यवाद! –

3

आपका चयन बयान गुमनाम प्रकार, नहीं DataRows के अनुक्रम का एक अनुक्रम लौटा रहा है। CopyToDataTable() केवल IEnumerable<T> पर उपलब्ध है जहां TDataRow से प्राप्त या प्राप्त होता है। आप CopyToDataTable पर कॉल करने के लिए पंक्ति ऑब्जेक्ट r चुन सकते हैं।

var query = from r in matrix.AsEnumerable() 
       where r.Field<string>("c_to") == c_to && 
         r.Field<string>("p_to") == p_to 
       select r; 

DataTable conversions = query.CopyToDataTable(); 

भी कर सकते हैं implement CopyToDataTable कहाँ जेनेरिक प्रकार टी एक DataRow नहीं है।

+0

हाय में दर्ज करें। मुझे पता है कि मेरा कोड गलत है। सवाल यह है कि केवल दो कॉलम चुनने का सही तरीका है, न कि पूरी पंक्ति। –

+0

मैंने ऐसा करने के लिए मेरे उत्तर में आलेख में लिंक जोड़ा है, http://msdn.microsoft.com/en-us/library/bb669096.aspx – Adil

+0

क्या मैं इस प्रकार को एक डाटरो के रूप में छोड़ सकता हूं लेकिन बस विशिष्ट कॉलम फ़िल्टर कर सकता हूं? –

6
यहाँ मैं mainDataTable से केवल तीन विशिष्ट स्तंभ हो और फिल्टर का उपयोग

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable() 
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount"); 
5

प्रयास करें Access DataTable easiest way जो आप LINQ का उपयोग कर DataTable, डेटासेट तक पहुँचने के लिए एकदम सही विचार प्राप्त करने के लिए मदद कर सकते हैं ...

निम्नलिखित परीक्षा पर विचार करें कृपया, मान लें कि हमारे पास डेटाटेबल नीचे जैसा है।

DataTable ObjDt = new DataTable("List"); 
ObjDt.Columns.Add("WorkName", typeof(string)); 
ObjDt.Columns.Add("Price", typeof(decimal)); 
ObjDt.Columns.Add("Area", typeof(string)); 
ObjDt.Columns.Add("Quantity",typeof(int)); 
ObjDt.Columns.Add("Breath",typeof(decimal)); 
ObjDt.Columns.Add("Length",typeof(decimal)); 

यहाँ ऊपर DatTable के लिए कोड है, यहाँ हम यह मान कुछ डेटा इस DataTable में उपलब्ध हैं देखते हैं कि, और जैसा कि नीचे दिखाया कुछ डेटा प्रसंस्करण द्वारा विशेष की ग्रिड दृश्य बाध्य करने के लिए है।

क्षेत्र | मात्रा | सांस | लंबाई | मूल्य = मात्रा * सांस * लंबाई

से हम निम्न क्वेरी जो हमें सही परिणाम दे देंगे के रूप में हम चाहते हैं आग की है।

var data = ObjDt.AsEnumerable().Select 
      (r => new 
      { 
       Area = r.Field<string>("Area"), 
       Que = r.Field<int>("Quantity"), 
       Breath = r.Field<decimal>("Breath"), 
       Length = r.Field<decimal>("Length"), 
       totLen = r.Field<int>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length")) 
      }).ToList(); 

हमें डेटा डेटा के रूप में इस डेटा चर को असाइन करना होगा।

इस सरल Linq क्वेरी का उपयोग हम प्राप्त कर सकते हैं तक हमारे सभी को स्वीकार करता है, और यह भी कि हम इस के साथ अन्य सभी LINQ प्रश्नों प्रदर्शन कर सकते हैं ...

5

LINQ बहुत प्रभावी और नहीं बल्कि DataTable से सूचियाँ पर उपयोग करने के लिए आसान है। मैं देख सकता हूं कि उपर्युक्त उत्तरों में लूप (फॉरवर्ड, फॉरच) है, जिसे मैं पसंद नहीं करूंगा।

तो डेटाटेबल से एक लंबवत कॉलम का चयन करने के लिए सबसे अच्छी बात यह है कि कॉलम फ़िल्टर करने के लिए डेटाव्यू का उपयोग करें और इसे वांछित करें।

इसे यहां कैसे करें इसे ढूंढें।

DataView dtView = new DataView(dtYourDataTable); 
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA"); 

अब DataTable dtTableWithOneColumn केवल एक स्तंभ (Columna) शामिल हैं।