c# - डेटाटेबल पर LINQ क्वेरी




11 Answers

आप DataRowCollection पंक्ति संग्रह के खिलाफ क्वेरी नहीं कर सकते हैं, क्योंकि DataRowCollection IEnumerable<T> लागू नहीं करता है। आपको AsEnumerable() लिए AsEnumerable() एक्सटेंशन का उपयोग करने की आवश्यकता है। इस तरह:

var results = from myRow in myDataTable.AsEnumerable()
where myRow.Field<int>("RowNo") == 1
select myRow;

और जैसा किथ कहता है, आपको System.Data.DataSetExtensions संदर्भ जोड़ना होगा

AsEnumerable() IEnumerable<DataRow> । यदि आपको IEnumerable<DataRow> को IEnumerable<DataRow> कनवर्ट करने की आवश्यकता है, तो CopyToDataTable() एक्सटेंशन का उपयोग करें।

मैं डेटाटेबल ऑब्जेक्ट पर LINQ क्वेरी करने की कोशिश कर रहा हूं और विचित्र रूप से मुझे लगता है कि डेटाटेबल्स पर ऐसे प्रश्न निष्पादित करना सीधा नहीं है। उदाहरण के लिए:

var results = from myRow in myDataTable
where results.Field("RowNo") == 1
select results;

इसकी अनुमति नहीं है। मैं इस काम की तरह कुछ कैसे प्राप्त करूं?

मुझे आश्चर्य है कि डेटाटेबल्स पर LINQ क्वेरीज़ की अनुमति नहीं है!




ऐसा नहीं है कि उन्हें डेटाटेबल्स पर जानबूझकर अनुमति नहीं दी गई थी, यह सिर्फ डेटाटेबल्स IQueryable और जेनेरिक आईनेमेरेबल संरचनाओं की पूर्व-तारीख है जिस पर लिंक प्रश्नों का प्रदर्शन किया जा सकता है।

दोनों इंटरफेस को कुछ प्रकार के प्रकार-सुरक्षा सत्यापन की आवश्यकता होती है। डेटाटेबल दृढ़ता से टाइप नहीं किए जाते हैं। यही कारण है कि लोग एक ऐरेलिस्ट के खिलाफ सवाल नहीं कर सकते हैं, उदाहरण के लिए।

लिंक के लिए काम करने के लिए आपको अपने परिणामों को टाइप-सुरक्षित ऑब्जेक्ट्स और उसके विरुद्ध पूछताछ के विरुद्ध मैप करने की आवश्यकता है।




var query = from p in dt.AsEnumerable()
                    where p.Field<string>("code") == this.txtCat.Text
                    select new
                    {
                        name = p.Field<string>("name"),
                        age= p.Field<int>("age")                         
                    };



//Create DataTable 
DataTable dt= new DataTable();
dt.Columns.AddRange(New DataColumn[]
{
   new DataColumn("ID",typeOf(System.Int32)),
   new DataColumn("Name",typeOf(System.String))

});

//Fill with data

dt.Rows.Add(new Object[]{1,"Test1"});
dt.Rows.Add(new Object[]{2,"Test2"});

//Now  Query DataTable with linq
//To work with linq it should required our source implement IEnumerable interface.
//But DataTable not Implement IEnumerable interface
//So we call DataTable Extension method  i.e AsEnumerable() this will return EnumerableRowCollection<DataRow>


// Now Query DataTable to find Row whoes ID=1

DataRow drow = dt.AsEnumerable().Where(p=>p.Field<Int32>(0)==1).FirstOrDefault();
 // 



आप लाइन संग्रह पर ऑब्जेक्ट्स के लिए LINQ का उपयोग कर सकते हैं, जैसे:

var results = from myRow in myDataTable.Rows where myRow.Field("RowNo") == 1 select myRow;



इसे इस्तेमाल करे

var row = (from result in dt.AsEnumerable().OrderBy( result => Guid.NewGuid()) select result).Take(3) ; 



यह एक आसान तरीका है जो मेरे लिए काम करता है और लैम्ब्डा अभिव्यक्तियों का उपयोग करता है:

var results = myDataTable.Select("").FirstOrDefault(x => (int)x["RowNo"] == 1)

फिर यदि आप एक विशेष मूल्य चाहते हैं:

if(results != null) 
    var foo = results["ColName"].ToString()



वीबी.नेट के लिए कोड इस तरह दिखेगा:

Dim results = From myRow In myDataTable  
Where myRow.Field(Of Int32)("RowNo") = 1 Select myRow



IEnumerable<string> result = from myRow in dataTableResult.AsEnumerable()
                             select myRow["server"].ToString() ;



आप इसे linq के माध्यम से सुरुचिपूर्ण काम कर सकते हैं:

from prod in TenMostExpensiveProducts().Tables[0].AsEnumerable()
where prod.Field<decimal>("UnitPrice") > 62.500M
select prod

या गतिशील linq की तरह (AsDynamic सीधे डेटासेट पर कहा जाता है):

TenMostExpensiveProducts().AsDynamic().Where (x => x.UnitPrice > 62.500M)

मैं सबसे लचीला है जबकि मैं अंतिम दृष्टिकोण पसंद करते हैं। पीएस: System.Data.DataSetExtensions.dll संदर्भ कनेक्ट करने के लिए मत भूलना




आप इसे आजमा सकते हैं, लेकिन आपको यह सुनिश्चित करना होगा कि प्रत्येक कॉलम के लिए मानों का प्रकार होना चाहिए

List<MyClass> result = myDataTable.AsEnumerable().Select(x=> new MyClass(){
     Property1 = (string)x.Field<string>("ColumnName1"),
     Property1 = (int)x.Field<int>("ColumnName2"),
     Property1 = (bool)x.Field<bool>("ColumnName3"),    
});



Related

c# .net linq datatable .net-3.5