2011-01-12 17 views
6

डिवाइस प्रकारों का संग्रह है, जिनमें से कुछ समर्थन कॉन्फ़िगरेशन सेटिंग (ओं) हैं। मैं सभी डिवाइस प्रकारों और किसी भी लागू सेटिंग्स की एक सूची प्राप्त करने का प्रयास कर रहा हूं।लिंक बाएं बाहरी शामिल हों - डिफ़ॉल्ट त्रुटि त्रुटि

यह क्वेरी उन डिवाइसों को नहीं उठा रही है जिनमें डिवाइस पैरामीटर नहीं हैं। यदि मैं नीचे दिखाए गए DefaultIfEmpty() को जोड़ता हूं, तो मुझे यह त्रुटि मिलती है:

"मूल्य प्रकार का मूल्य 'Int64' विफल हुआ क्योंकि भौतिक मूल्य शून्य है। या तो परिणाम प्रकार का सामान्य पैरामीटर या क्वेरी का उपयोग करना चाहिए एक शून्य प्रकार। "

डिफ़ॉल्ट IfEmpty के लिए सही synatx क्या है?

  var Devices = from d in dc.DeviceTypes 
         join p in dc.DeviceParameters on d.TypeID equals p.TypeID into tmpTable 
         from items in tmpTable.DefaultIfEmpty() 
         group items by d.DeviceName into g 
         select new 
         { 
          DeviceName = g.Key, 
          settings = from s in g 
            select new 
            { 
             ParamName = s.ParamName, 
             Param1 = s.Param1, 
             Param2 = s.Param2, 
             Param3 = s.Param3 
            } 
         }; 
+0

क्या आपने टाइपिड्स को निरर्थक int में कास्टिंग करने का प्रयास किया है? "ऑन (int?) डी। टाइपइप बराबर (int?) p.TypeID" ... –

+0

जैकब: सुझाव के लिए धन्यवाद, लेकिन एक ही त्रुटि कास्ट के साथ भी होती है। –

+0

:)। एक शॉट के लायक और अद्यतन के लिए धन्यवाद। खुशी है कि आपको एक योग्य उत्तर मिला है। –

उत्तर

4

आप विदेशी कुंजी रिश्ते को परिभाषित किया है, तो मुझे लगता है कि समाधान बिल्कुल स्पष्ट है, जब तक मैं कुछ याद कर रहा हूँ:

var Devices = dc.DeviceTypes 
    .Select(p=>new 
     { 
      DeviceName = p.DeviceName , 
      settings = p.DeviceParameters 
       .Select(q=>new 
       { 
        ParamName = p.ParamName, 
        Param1 = q.Param1, 
        Param2 = q.Param2, 
        Param3 = q.Param3 
       }) 
     }); 

फिर भी, मैं शायद सेटिंग्स हिस्सा इस तरह से करना होगा:

settings = p.DeviceParameters.ToList() 
+0

धन्यवाद! जो मुझे चाहिए वह लौटाता है। –

+0

Fyi, p.DeviceParameters.ToList() ने यह त्रुटि दी: LINQ से संस्थाएं 'System.Collections.Generic.List'1 [Instruments.DeviceParameters] ToList [DeviceParameters] (System.Collections.Generic.IEnumerable' 1 [इंस्ट्रूमेंट्स। डेविस पैरामीटर]) 'विधि, और इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है। –

+0

ओह, मैं देखता हूं। यह नहीं पता था कि यह इस तरह से काम नहीं करता है, मैं LINQ से इकाइयों के लिए नया हूं। साझा करने के लिए Thx =) – Francisco

1

मेरा मानना ​​है कि मुद्दा यह है कि आप अपनी क्वेरी के साथ देख रहे हैं कि DefaultIfEmpty() का उपयोग करके आप तो एक अशक्त ओ से बाहर मान खींचने की कोशिश कर रहे हैं कहते हैं bject। यदि आप एक वैध DeviceType है, लेकिन किसी भी DeviceParameters तो मैप किया नहीं है, तो जब यह इस कथन से सेटिंग संपत्ति अमल में लाना करने के लिए कोशिश कर रहा है:

settings = from s in g 
select new 
{ 
    ParamName = s.ParamName, 
    Param1 = s.Param1, 
    Param2 = s.Param2, 
    Param3 = s.Param3 
} 

यह "एस" के लिए एक नई वस्तु और वस्तु बनाने के लिए कोशिश कर रहा है शून्य है इसलिए संपत्ति परमनाम या पैराम 1, आदि तक पहुंचने की कोशिश कर रहा है। मैंने LINQPad के भीतर एक ही कोड की कोशिश की और जब मैंने DefaultIfEmpty() कॉल को हटा दिया तो सबकुछ काम करता था।

गुणों और उनके प्रकारों को जानने के बिना मैं निश्चित नहीं हो सकता लेकिन जैसा कि मैंने कहा, LINQPad में समान कोड को लागू करने के आधार पर मुझे इसी तरह के परिणाम मिलते हैं।

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