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




.net datatable (14)

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

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

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

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


आप 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 के माध्यम से सुरुचिपूर्ण काम कर सकते हैं:

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 संदर्भ कनेक्ट करने के लिए मत भूलना


आप लाइन संग्रह पर ऑब्जेक्ट्स के लिए 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) ; 

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

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

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


क्वेरी की इस सरल पंक्ति को आज़माएं:

var result=myDataTable.AsEnumerable().Where(myRow => myRow.Field<int>("RowNo") == 1);

नीचे दिए गए यह कैसे प्राप्त करें इस पर उदाहरण:

DataSet dataSet = new DataSet(); //Create a dataset
dataSet = _DataEntryDataLayer.ReadResults(); //Call to the dataLayer to return the data

//LINQ query on a DataTable
var dataList = dataSet.Tables["DataTable"]
              .AsEnumerable()
              .Select(i => new
              {
                 ID = i["ID"],
                 Name = i["Name"]
               }).ToList();

मुझे एहसास है कि इसका उत्तर कुछ बार दिया गया है, लेकिन सिर्फ एक और दृष्टिकोण प्रदान करने के लिए, मुझे .Cast<T>() विधि का उपयोग करना पसंद है, यह मुझे स्पष्ट प्रकार को परिभाषित करने में गहराई बनाए रखने में मदद करता है, और मुझे लगता है कि गहराई से मुझे लगता है .AsEnumerable() इसे वैसे भी कहते हैं:

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

या

var results = myDataTable.Rows.Cast<DataRow>()
                  .FirstOrDefault(x => x.Field<int>("RowNo") == 1);

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

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


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

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

var results = from DataRow myRow in myDataTable.Rows
    where (int)myRow["RowNo"] == 1
    select myRow




.net-3.5