2008-09-23 15 views
38

मैंकैसे एक LINQ वक्तव्य

var confirm = from l in lines.Lines 
where (l.LineNumber == startline.LineNumber) || (l.LineNumber == endline.LineNumber) 
select l; 

पुष्टि वस्तु System.Linq.Enumerable.WhereListIterator`1.MoveNext पर पर एक 'अशक्त वस्तु या नहीं एक संदर्भ' लौटने वस्तुओं बयान के एक Linq है डिबग करने के लिए()

यदि क्वेरी का परिणाम खाली था, तो यह केवल एक खाली गणनाकर्ता वापस कर देगा। मुझे इस तथ्य के बारे में पता है कि कथन में कोई शून्य वस्तु नहीं है। क्या यह LINQ कथन से आगे बढ़ना संभव है कि यह कहां गिर रहा है?

संपादित जब मैंने कहा मुझे कोई अशक्त वस्तुओं यह पता चला है कि मैं झूठ बोल रहा था देखते हैं कि एक तथ्य के लिए पता है: [, लेकिन सवाल बनी हुई है, हालांकि मैं इस सवाल का जवाब asuming हूँ होगा 'आप नहीं कर सकते वास्तव में '

LINQPad एक अच्छा विचार है, मैं यह प्रयोग किया जाता है अपने आप को LINQ को पढ़ाने के लिए है, लेकिन मैं

+0

उत्तर क्या था? –

+3

42. असल में यदि आप मेरा संपादन पढ़ते हैं, तो यह है कि मेरे पास आश्वासन के बावजूद – johnc

उत्तर

27

एक डिबग/स्लेश के रूप में इसे देख फिर से शुरू और शैली उपकरण जला सकता है मुझे यकीन है कि अगर यह संभव है नहीं कर रहा हूँ वीएस से डीबग करें, लेकिन मुझे काफी उपयोगी होने के लिए LINQPad मिल गया है। यह आपको LINQ क्वेरी के प्रत्येक भाग के परिणामों को डंप करने देगा।

+6

तकिए के दूसरे पक्ष की तरह मेरा आश्वासन था। – Dested

3

अपवाद स्टैक ट्रेस की जांच करें और निष्पादित आपके कोड का अंतिम भाग देखें।

+0

इस तरह मैं सिस्टम को मिला .Linq.Enumerable.WhereListIterator'1.MoveNext() – johnc

+0

निष्पादित * आपके * कोड की आखिरी पंक्ति क्या है? WhereListIterator आपका कोड नहीं है (यह एक LINQ एपीआई है)। –

3

त्रुटि के दिखने से मैं सुझाव दूंगा कि आप लाइन पर एक नज़र डालें। रेखाएं और सुनिश्चित करें कि इसके गणक को ठीक से लागू किया गया है। मुझे लगता है कि यह एक शून्य को वापस कर रहा है जब यह नहीं होना चाहिए।

ओह और बस लाइन और रेखा सुनिश्चित करें। रेखा वस्तुएं शून्य नहीं हैं या नल वापस लौट रही हैं।

14

आप अपने LINQ कथन के where खंड में अभिव्यक्ति पर ब्रेकपॉइंट सेट करने में सक्षम होना चाहिए।

इस उदाहरण में, कोड की निम्न अनुभाग में कहीं भी कर्सर रखें:

(l.LineNumber == startline.LineNumber) || (l.LineNumber == endline.LineNumber) 

फिर F9 दबाएँ या ब्रेकप्वाइंट जोड़ने के लिए मेनू या संदर्भ का उपयोग करें।

सही ढंग से सेट करते समय, केवल उपरोक्त कोड में संपूर्ण LINQ कथन के बजाय संपादक में ब्रेकपॉइंट स्वरूपण होना चाहिए। आप देखने के लिए ब्रेकपॉइंट विंडो में भी देख सकते हैं।

यदि आपने इसे सही तरीके से सेट किया है, तो आप प्रत्येक बार फ़ंक्शन पर रोक देंगे जो क्वेरी के उपरोक्त भाग को लागू करता है।

+1

ओपी की तलाश में यह जवाब नहीं हो सकता है, लेकिन मुझे बहुत मदद मिली।मैंने सोचा था कि विजुअल स्टूडियो लैम्ब्डा एक्सप्रेशन को डीबग करने में असमर्थ था, मुख्य रूप से क्योंकि जब मैं ब्रेकपॉइंट्स (गलत कॉलम पर कर्सर के साथ) डाल रहा था, तो यह पूरी लाइन पेंट कर रहा था, न केवल लैम्ब्डा जिसे मैं डिबग करना चाहता था, बल्कि क्विक वॉच विंडो लैम्ब्डा अभिव्यक्तियों का मूल्यांकन करने में असमर्थ है। – ygormutti

+0

स्पष्टीकरण के लिए, डीबगर लिनक क्वेरी –

29

हां वास्तव में एक linq क्वेरी के माध्यम से निष्पादन मिडवे को रोकना संभव है।

लैंबडा अभिव्यक्तियों का उपयोग करके अपने linq को क्वेरी शैली में कनवर्ट करें और एक चयन कथन डालें जो लिनक में उस बिंदु के बाद कहीं भी लौटता है जिसे आप डिबग करना चाहते हैं। कुछ नमूना कोड इसे स्पष्ट कर देगा -

 var query = dataset.Tables[0].AsEnumerable() 
      .Where (i=> i.Field<string>("Project").Contains("070932.01")) 
//   .Select(i => 
//   {return i;} 
//   ) 
      .Select (i=>i.Field<string>("City")); 

फिर टिप्पणी की गई पंक्तियों को असम्बद्ध करें। सुनिश्चित करें कि {वापसी i;} अपनी लाइन पर है और वहां एक डीबग बिंदु डालें। आप अपनी लंबी, जटिल linq क्वेरी में किसी भी बिंदु पर यह चयन कर सकते हैं।

14

मैंने सरल-वार्ता पर प्रकाशित इस प्रश्न को संबोधित करने वाला एक व्यापक लेख लिखा था।कॉम (LINQ Secrets Revealed: Chaining and Debugging) 2010 में वापस:

मैं विजुअल स्टूडियो में एक महान उपकरण बाहरी के रूप में LINQPad (जैसा कि पहले ओवेनपी द्वारा उल्लिखित है) के बारे में बात करता है। अपने असाधारण डंप() विधि पर विशेष ध्यान दें। एक अद्भुत साफ और स्पष्ट फैशन में आपके डेटा को देखने के लिए आप LINQ श्रृंखला में एक या अधिक बिंदुओं पर इसे इंजेक्ट कर सकते हैं। हालांकि बहुत उपयोगी, LINQPad विजुअल स्टूडियो के बाहर है। इसलिए मैं भी मौजूद कई उपयोग के लिए उपलब्ध तकनीकों दृश्य स्टूडियो के भीतर क्योंकि कभी कभी यह सिर्फ व्यावहारिक नहीं LINQPad के लिए खत्म कोड का एक हिस्सा विस्थापित करने के लिए है:

(1) इंजेक्षन डंप() विस्तार विधि मैं में पेश करने के लिए कहता है लॉगिंग की अनुमति देने के लिए मेरा लेख। मैं उसकी जानकारीपूर्ण लेख LINQ to Objects – Debugging में बार्ट De Smet वॉच() विधि के साथ शुरू कर दिया और, दृश्य को बढ़ाने के लिए हालांकि अभी भी यह LINQPad का डंप उत्पादन की तुलना में pales कुछ लेबलिंग और colorization गयी।

(2) सही रॉबर्ट Ivanc के LINQPad Visualizer ऐड-इन के साथ दृश्य स्टूडियो में LINQPad का दृश्य ले आओ। सुनिश्चित नहीं हैं कि अगर यह मेरी उकसाने :-) के माध्यम से गया था, लेकिन जोड़ी वर्तमान जब मैं अपने लेख लिख रहा था असुविधाओं अब सभी सराहनीय किया गया नवीनतम रिलीज में संबोधित किया है। इसमें पूर्ण VS2010 समर्थन है और आपको डीबगिंग के दौरान पसंद की जाने वाली किसी ऑब्जेक्ट की जांच करने देता है।

(3) अपने LINQ श्रृंखला के बीच में एम्बेड nop बयान आप विच्छेदबिंदु सेट कर सकते हैं ताकि कमाल पीट द्वारा पहले बताई।

2016.12.01 अद्यतन

और मैं सिर्फ उपरोक्त लेख की अगली कड़ी के लिए, बस शीर्षक LINQ Debugging and Visualization है, जो पता चलता है कि सच LINQ डिबगिंग क्षमता अंत में साथ दृश्य स्टूडियो 2015 में आ गया है लिखा था के बारे में होने वाली है OzCode में रिलीज नई सुविधा। @ इस सवाल का Dror के जवाब इसके बारे में एक छोटी सी झलक से पता चलता है, लेकिन मैं आप में गहराई के लिए अपने नए लेख को पढ़ने के "कैसे" करने के लिए प्रोत्साहित करते हैं। (और मैं नहीं ओज़कोड के लिए काम करता हूं। :-)

3

किसी भी अस्थायी ब्रेकपॉइंट्स को सेट किए बिना LINQ अभिव्यक्ति के अंदर कदम करना संभव है। आप समारोह जो का मूल्यांकन करता है LINQ अभिव्यक्ति, जैसे में कदम की जरूरत है:

var confirm = from l in lines.Lines 
       where (l.LineNumber == startline.LineNumber) 
        || (l.LineNumber == endline.LineNumber) 
       select l; 

confirm.ToArray(); // Press F11 ("Step into") when you reach this statement 

foreach(var o in q) // Press F11 when "in" keyword is highlighted as "next statement" 
    // ... 
+0

धारण करने वाले चर के लिए पहले संदर्भ * के बाद linq क्वेरी दर्ज करेगा। यह 'टोलिस्ट() ' – xleon

+1

के साथ भी काम करता है यह स्वीकार्य उत्तर होना चाहिए। –

3

[अस्वीकरण: मैं OzCode पर काम]

LINQ के साथ समस्या यह है कि यह डिबग करने के लिए असंभव मुश्किल है - सरल प्रश्नों का निपटारा करते समय भी एक डेवलपर को अपनी पूछताछ को फोरच लूप के समूह में दोबारा करने के लिए मजबूर होना पड़ता है, या लॉगिंग का उपयोग करता है। LINQ डिबगिंग OzCode (currently available as an Early Access Preview) के एक जल्द ही होने वाली हो से जारी किया संस्करण में समर्थित है और यह डेवलपर्स के साथ-साथ उनके LINQ कोड और गहराई में जाने और अंदर प्रश्नों

यह वही है आपकी क्वेरी होगा है अपवादों को पकड़ने के लिए उन कठिन इंगित मदद करता है ओज़कोड में दिखें: Debugging LINQ exception

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