2009-01-12 16 views
5

जब मैं लिंक से एसक्यूएल की बात करता हूं तो मैं एक नौसिखिया हूं लेकिन मुझे उम्मीद है कि आप मदद कर सकते हैं। मैं विस्तार के तरीके के साथ निम्नलिखित LINQ एसक्यूएल को बयान लिखा है:लिंक से एसक्यूएल का उपयोग करते समय मुझे "अमान्य कास्ट" क्यों मिल रहा है?

Cedb.ClassEvents.Where(c => c.ClassID == 1).Select(c => c).Single() 

कहाँ Cedb DataContext है, ClassEvents एक मेज (वर्गों और घटनाओं के लिए एक सुविधा में आयोजित किया जा रहा है) और ClassID एक अद्वितीय पूर्णांक कुंजी है।

यह क्वेरी लिंककैड (सीडीबी के बिना) में ठीक है। जब यह लौटता है, तो यह कहता है कि वापसी का प्रकार "क्लासइवेंट" है। विजुअल स्टूडियो में इंटेलिसेंस में, यह मुझे बताता है कि इस क्वेरी का रिटर्न प्रकार क्लासइवेंट है (मेरे डेटा मॉडल में बनाया गया है)। हालांकि, जब मैं एक चर में परिणाम देने का प्रयास:

var classEvent = Cedc.ClassEvents.Where(c.ClassID == 1).Select(c => c).Single(); 

तो मैं कोई त्रुटि मिलती है: InvalidCastException: निर्दिष्ट डाली मान्य नहीं है। वही बात होती है यदि मैं var के स्थान पर "क्लासइवेंट" कक्षा का उपयोग करता हूं। मैं इसके लिए नया हूं लेकिन यह एक बग के बजाए एक असली स्लैम डंक जैसा लगता है। क्या सिंगल विधि के बारे में कुछ है जो मुझे नहीं पता कि त्रुटि का कारण बन रहा है? किसी भी सहायता की सराहना की जाएगी!

उत्तर

5

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

फिर भी, मैं जवाब की सराहना करता हूं!

+0

आपके उत्तर के लिए धन्यवाद, दुर्भाग्य से इसका मतलब यह है कि हम डेटाबेस से बात करने के लिए लिंक से SQL का उपयोग नहीं कर सकते क्या थोड़ा अलग स्कीमा हो सकता है? – jpierson

1

आप दोनों एक का चयन करें और एक एकल, वास्तव में, तुम भी कहाँ की जरूरत नहीं है, आप के साथ प्राप्त कर सकते हैं क्या करने की जरूरत नहीं है (http://msdn.microsoft.com/en-us/library/bb535118.aspx देखें):

var classEvent = Cedc.ClassEvents.Single(c => c.ClassID == 1); 

मैं था Single का उपयोग करने के खिलाफ भी अनुशंसा करते हैं जब तक कि आप 100% सुनिश्चित न हों कि Func<T, bool> हमेशा एक मान वापस कर देगा, जैसे कि यह कोई मान नहीं लौटाता है, तो आपके पास एक अपवाद फेंक दिया जाएगा। बेहतर SingleOrDefault का उपयोग कर रहा है और ऑब्जेक्ट (http://msdn.microsoft.com/en-us/library/bb549274.aspx)

+0

धन्यवाद! मैंने टाइपिंग शुरू कर दी "और अगर कोई आसान तरीका जानता है ..." क्योंकि मुझे एक "10 मिथक" लेख याद है जो इस तरह के कुछ समझाता है। हालांकि, मैं समझना चाहता हूं कि सब कुछ क्या करता है और न केवल शॉर्टकट के लिए जाता है। सौभाग्य से, आपने दोनों किया था। एक बार फिर धन्यवाद। –

+0

[10 LINQ मिथकों] से लिंक करें (http://www.albahari.com/nutshell/10linqmyths.aspx) – Justin

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

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