2011-11-27 7 views
12

जबकि LINQ निम्नलिखित के निष्पादन, मैं इस अपवाद:LINQ: के रूप में "अनुक्रम कोई तत्व शामिल हैं" अपवाद

newGradeRow[rowCnt + 1 + "Grade " + ExamName] = 
     objDataSet.Tables[1].Rows.Cast<DataRow>() 
     .Where(p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks 
     && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"])) 
     .Select(p => Convert.ToString(p["EMG_GRADE_NAME"])) 
     .First(); 
:

Linq कोड "अनुक्रम कोई तत्व शामिल हैं"

क्या कोई इस पर मेरी सहायता कर सकता है?

+3

अपवाद स्पष्ट है - आप जिन सूचियों के साथ काम कर रहे हैं उनमें से एक खाली है और कोई परिणाम नहीं लौटा रहा है। – Oded

+2

जैसा कि मैंने प्रश्न में उल्लेख किया है, निष्पादन के दौरान मुझे अपवाद मिलता है क्योंकि "अनुक्रम में कोई तत्व नहीं है"। क्या आप कृपया मुझे बता सकते हैं कि मुझे यह अपवाद क्यों मिल रहा है या कोड में क्या गलत है। मैं .NET के लिए नया हूँ। –

+2

मुझे लगता है कि आपके संग्रह में कोई आइटम नहीं है। * आपको लगता है कि आपको क्या करना चाहिए? यह सवाल बुनियादी विचारों में एक अभ्यास है। – Amy

उत्तर

0

objDataSet.Tables[1] खाली है?

शायद डेटा objDataSet.Tables[0] में है?

किसी भी तरह से, आप objDataSet.Tables.Count() > 0

साथ परीक्षण कर सकते हैं आप पंक्तियों के लिए एक ही कर सकते हैं: objDataSet.Tables[1].Rows.Count() > 0

+2

या कोई तत्व 'कहां' फ़िल्टर पास नहीं करता है। अपवाद को 'फर्स्ट' द्वारा उठाया जाता है जब इसे खाली सूची दी जाती है। –

+0

ओह हाँ। धन्यवाद। –

39

अपवाद First विधि कॉल में फेंक दिया जाता है, तो अनुक्रम रिक्त है के रूप में यह documentation में कहा गया है । इस मामले में FirstOrDefault विधि का उपयोग करना बेहतर है - यह डिफ़ॉल्ट मान (विशिष्ट मामले null में) वापस कर देगा और कोई अपवाद नहीं फेंक दिया जाएगा।

1

आपको इस पर ध्यान रखना चाहिए कि: क्या लिंक अभिव्यक्ति/क्वेरी में कोई रिकॉर्ड नहीं है तो आप Single() और First() का उपयोग नहीं कर सकते हैं।

On the place Single() in your Lambda expression use FirstOrDefault() 
2

यह कहना मुश्किल है कि अनुक्रम में कोई तत्व नहीं है जब आप कोड की एक ही पंक्ति में एक साथ चिपके हुए हैं। अपने कोड को कई लाइनों पर तोड़ने का प्रयास करें और फिर इसे डीबग करें। यह इसे और भी पठनीय बना देगा।

var myVariable = objDataSet.Tables[1]; 
var myEntity = myVariable.Rows.Cast<DataRow>().Where(
    p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks 
    && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"])) 
    .Select(p => Convert.ToString(p["EMG_GRADE_NAME"])).FirstOrDefault(); 

समस्या अपने लैम्ब्डा अभिव्यक्ति में कहीं है, तो आप एक foreach पाश (सिर्फ डिबगिंग & वी.एस. के तत्काल खिड़की के भीतर डेटा पर पहुंच के लिए) में बाहर तोड़ सकते हैं।

+1

ThYou ने अंतिम कॉल को 'FirstOrDefault()' में बदल दिया है जो अपवाद से छुटकारा पायेगा लेकिन आपने इसका उल्लेख नहीं किया है जो थोड़ा अजीब है। –

+0

मेरी गलती। मैं बेहतर अपवाद हैंडलिंग के लिए प्रथम() पर FirstOrDefault() एक्सटेंशन विधि का उपयोग करना पसंद करता हूं। आगे बढ़ने से पहले आप बाद में नल की जांच कर सकते हैं। –

6

इसे तोड़कर शुरू करें। आपका वर्तमान कोड डीबगर के लिए कोई पकड़ प्रदान नहीं करता है।

var r1 = objDataSet.Tables[1].Rows; 
var r2 = r1.Cast<DataRow>(); 
System.Diagnostics.Debug.Print("r2: {0}", r2.Count()); 
var r3 = r2.Where(p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks 
      && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"])); 
System.Diagnostics.Debug.Print("r3: {0}", r3.Count()); 
var r4 = r3.Select(p => Convert.ToString(p["EMG_GRADE_NAME"])); 
var r5 = r4.First(); 

newGradeRow[rowCnt + 1 + "Grade " + ExamName] = r5; 
+0

जबकि कोड थोड़ा सा स्पष्ट रूप से है, यह स्पष्ट है कि केवल उस चीज जो उस अपवाद को फेंक देगी वह पहले() के लिए कॉल है जिसके लिए 1 या अधिक तत्वों की आवश्यकता होती है। –

+0

@ बेनबॉबिन्सन, सहमत हैं, लेकिन यह 'कहां() 'से पहले या बाद में खाली है? मैं जानना चाहता हूँ। –

+3

पर्याप्त मेला, लेकिन मैं सुझाव दूंगा कि आप उल्लेख करते हैं कि यह 'प्रथम()' का आह्वान है जो 'प्रथम()' और 'फर्स्टऑर्ड डीफॉल्ट() ' –

संबंधित मुद्दे