2009-08-12 18 views
6

में सबसे पहले मुझे कहना है कि मैं LINQ का उपयोग कर एक नया हूं। दरअसल मैंने पहले कभी नहीं उपयोग किया था, लेकिन मेरे पास एक ऐसा कार्य है जहां मुझे एक सूची से आने वाले मानों का उपयोग करके डेटाटेबल को फ़िल्टर करने की आवश्यकता है। तो मैं जानना चाहूंगा कि LINQ में फ़िल्टर मानों के रूप में सूची में मानों का उपयोग करके डेटाटेबल पर क्वेरी करना संभव है या नहीं। कोई मुझे कुछ संकेत दे सकता हैLINQ का उपयोग कर डेटासेट से पंक्तियां चुनें, जहां पंक्तियों की सूची सूची <T>

धन्यवाद।

उत्तर

7

ऐसा करने का सबसे अच्छा तरीका फ़िल्टर किए गए परिणामों के साथ आप क्या करना चाहते हैं इस पर निर्भर करता है। क्या आपको आगे के संचालन के लिए डेटाटेबल के रूप में परिणामों की आवश्यकता है, या आप परिणामों के लिए डेटाबेस कर रहे हैं?

नीचे मिलान DataRows

//create sample table with sample rows 
DataTable table = new DataTable(); 

table.Columns.Add("id", typeof(int)); 

for (int i = 1; i < 11; i++) 
{ 
    DataRow row = table.NewRow(); 
    row[0] = i; 
    table.Rows.Add(row); 
} 

//filter the table by id (in a list) 
List<int> rowIds = new List<int> { 1, 3, 6 }; 

IEnumerable<DataRow> matchingRows = from DataRow row in table.Rows 
        where rowIds.Contains((int)row[0]) 
        select row; 

आप एक DataTable की जरूरत है यदि आप किसी अन्य तालिका में पंक्तियां आयात कर सकता है जो एक (bindable) देता है उदाहरण के लिए, प्रगणक लें:

DataTable filteredTable = table.Clone(); 

foreach (DataRow filteredRow in matchingRows) 
{ 
    filteredTable.ImportRow(filteredRow); 
} 
+0

एक तरह से एक datatable में बदलने के लिए .CopyToDataTable() का उपयोग करना है, इस मामले में अगर matchingRows.Any() matchingRows.CopyToDataTable करने से पहले सच रिटर्न() जांच करना न भूलें। इसके लिए System.Data.DataTableExtensions की आवश्यकता है – Enrico

2

मैं आमतौर पर देना जब मैं एक पूर्व-LINQ ऑब्जेक्ट को LINQ- तैयार ऑब्जेक्ट के रूप में इलाज करने की आवश्यकता होती हूं तो स्वयं विस्तार विधियां। उदाहरण के लिए, आप DataRowCollection (DataTable.Rows प्रॉपर्टी) पर क्वेरी करना चाहते हैं, जिसे आप शायद DataRows की सूची से अधिक कुछ भी नहीं कर रहे हैं। मैं एक विस्तार विधि बनाउंगा जो आपके लिए यह परिवर्तन करता है (DataRowCollection से List<DataRow>)। मैं आमतौर पर मूल्यों को सुरक्षित रूप से प्राप्त करने के लिए एक विस्तार विधि का उपयोग करता हूं, जब मुझे किसी अपवाद को फेंकने की परवाह नहीं होती है, तो किसी कारण से कॉलम के लिए अमान्य कुंजी नाम प्रदान किया जाता है। फिर, आप एक विस्तार विधि बना सकते हैं जो इन्ट्स की एक सूची आईडी के रूप में लेती है और एक फ़ील्ड नाम जिसमें आईडी आप चाहते हैं उसे वापस करने के लिए। जब सब कुछ कहा और किया जाता है, यह कोड की एक पंक्ति के साथ किया जाता है। यहां आपके सभी एक्सटेंशन विधियों के साथ कक्षा है। एक भी विधि कॉल:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication11 
{ 
    public static class SystemDataHelpers 
    { 
     public static List<DataRow> RowList(this DataTable table) 
     { 
      List<DataRow> list = new List<DataRow>(); 
      foreach (DataRow row in table.Rows) 
       list.Add(row); 
      return list; 
     } 

     public static object GetItem(this DataRow row, string field) 
     { 
      if (!row.Table.Columns.Contains(field)) 
       return null; 
      return row[field]; 
     } 

     public static List<DataRow> GetRows(this DataTable table, List<int> ids, string fieldName) 
     { 
      Func<DataRow, bool> filter = row => ids.Contains((int)row.GetItem(fieldName)); 
      return table.RowList().Where(filter).ToList(); 
     } 
    } 
} 

फिर, अपने चर की स्थापना के अलावा अन्य (जो आप करने की ज़रूरत नहीं है ... आप पहले से मौजूद हैं), वास्तविक काम कोड की एक पंक्ति (संपादित साथ किया जाता है):

 DataTable table = new DataTable(); 
     List<int> rowIds = new List<int> { 1, 2, 3, 4 }; 
     string idFieldName = "row_id"; 

     List<DataRow> selected = table.GetRows(rowIds, idFieldName); 
संबंधित मुद्दे