2010-08-11 7 views
10

मैं कैसे Col1 = "MyValue"मैं DataRows फ़िल्टर करने के लिए लैम्ब्डा अभिव्यक्तियों का उपयोग कैसे करूं?

मैं

Assert.IsTrue(dataSet.Tables[0].Rows. 
    FindAll(x => x.Col1 == "MyValue").Count == 1); 

लेकिन निश्चित है कि काम नहीं करता है की तरह कुछ सोच रहा हूँ के साथ एक पंक्ति के लिए एक datatable में पंक्तियों खोज कर सकते हैं!

+0

आप मिलान पंक्तियों को वापस करना चाहते हैं, या बस कितने हैं इसकी गिनती है? –

उत्तर

23

आप LINQ to DataSets का उपयोग करते हैं कर सकते हैं:

Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Count() == 1); 

ध्यान दें, यदि आप भी ऐसा कर सकते हैं कॉल के बिना दावा करने के लिए:

dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Single(); 

पंक्तियों की संख्या बराबर नहीं है तो एक (इसलिए, "एकल" पर कॉल), फिर एक अपवाद फेंक दिया जाएगा, और उस अनचाहे अपवाद आपके परीक्षण मामले में विफल होना चाहिए। व्यक्तिगत रूप से, मुझे उत्तरार्द्ध पसंद है, क्योंकि इसका स्पष्ट अर्थपूर्ण अर्थ है।

dataSet.Tables[0].AsEnumerable().Single(
    r => ((string) r["Col1"]) == "MyValue"); 

साथ ही, आपको DataRowExtensions class पर Field method का लाभ लेने के क्षेत्र के लिए टाइप सुरक्षित पहुंच आसान बनाने के लिए कर सकते हैं (और साथ ही के अतिरिक्त लाभ प्रदान:

ऊपर और नीचे करने के लिए छांटे जाते हैं किया जा सकता है परिवर्तित DBNull .NET में समकक्षों शून्य पर):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue"); 
0

आपके द्वारा लिखे गए कोड में पता चलता है कि केवल एक पंक्ति है जो आपकी खोज स्थिति को पूरा करती है। आप वास्तव में पंक्तियों चाहते हैं, ड्रॉप Assert और Count

1

का उपयोग क्यों करें लैम्ब्डा और नहीं select?

DataRow[] foundRow = (dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'"); 
+0

केवल 1 बराबर चिह्न – JWiley

2

ऐसा करने के लिए डेटा तालिका के Select विधि का उपयोग कर सकते हैं या पर DefaultDataView की फ़िल्टर संपत्ति टेबल।

Select विधि के लिए:

var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'"); 

DefaultView फ़िल्टर के लिए:

dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'"; 
foreach (var drv in dataSet.Tables[0].DefaultView) 
{ 
    // Do your processing 
} 
+0

होना चाहिए यह पूछताछकर्ता नहीं हो सकता है, लेकिन मुझे यह उपयोगी लगता है। – twip

3

आप इस कोशिश कर सकते हैं:

var b=datatable.AsEnumerable.where(p=> p.Field<string> 
("column_name")=="desire_value").CopyToDataTable() 
संबंधित मुद्दे