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


9 Answers

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

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

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

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

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




मेरे आवेदन में मैंने पाया कि उत्तर में सुझाए गए डेटाटेबल के लिए AsNnumerable () एक्सटेंशन के साथ LINQ से डेटासेट का उपयोग करना बेहद धीमा था। यदि आप गति के लिए अनुकूलित करने में रुचि रखते हैं, तो जेम्स न्यूटनकिंग की जेसननेट लाइब्रेरी का उपयोग करें ( http://james.newtonking.com/json/help/index.html )

// Serialize the DataTable to a json string
string serializedTable = JsonConvert.SerializeObject(myDataTable);    
Jarray dataRows = Jarray.Parse(serializedTable);

// Run the LINQ query
List<JToken> results = (from row in dataRows
                    where (int) row["ans_key"] == 42
                    select row).ToList();

// If you need the results to be in a DataTable
string jsonResults = JsonConvert.SerializeObject(results);
DataTable resultsTable = JsonConvert.DeserializeObject<DataTable>(jsonResults);



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

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



जैसा कि @ ch00k ने कहा:

using System.Data; //needed for the extension methods to work

...

var results = 
    from myRow in myDataTable.Rows 
    where myRow.Field<int>("RowNo") == 1 
    select myRow; //select the thing you want, not the collection

आपको System.Data.DataSetExtensions एक प्रोजेक्ट संदर्भ जोड़ने की भी आवश्यकता है




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

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



सबसे अधिक संभावना है, डेटासेट, डेटाटेबल और डेटारो के लिए कक्षाएं पहले ही समाधान में परिभाषित हैं। यदि ऐसा है तो आपको डेटासेट एक्सटेंशन संदर्भ की आवश्यकता नहीं होगी।

पूर्व। डेटासेट क्लास नाम-> कस्टमसेट, डेटारो क्लास नाम-> कस्टमटेबलरो (परिभाषित कॉलम के साथ: रोनो, ...)

var result = from myRow in myDataTable.Rows.OfType<CustomSet.CustomTableRow>()
             where myRow.RowNo == 1
             select myRow;

या (जैसा कि मैं पसंद करता हूं)

var result = myDataTable.Rows.OfType<CustomSet.CustomTableRow>().Where(myRow => myRow.RowNo);



मुझे एहसास है कि इसका उत्तर कुछ बार दिया गया है, लेकिन सिर्फ एक और दृष्टिकोण प्रदान करने के लिए, मुझे .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);



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

SqlCommand cmd = new SqlCommand( "Select * from Employee",con);
SqlDataReader dr = cmd.ExecuteReader( );
DataTable dt = new DataTable( "Employee" );
dt.Load( dr );
var Data = dt.AsEnumerable( );
var names = from emp in Data select emp.Field<String>( dt.Columns[1] );
foreach( var name in names )
{
    Console.WriteLine( name );
}



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






Related