2013-03-25 5 views
6

मेरे प्रश्न से संबंधित स्टैक ओवरफ्लो पर क्यू & ए बहुत सारे हैं, लेकिन मैं इस मुद्दे के समाधान को हल नहीं कर सकता और समाधान जो इस परिदृश्य में सबसे अच्छा काम करता है;नलबल फ़ील्ड और एसक्यूएल नल इश्यू

तो मैं एक विधि आप एक parentID पारित करने के लिए अनुमति देता है, और मूल्य रिकॉर्ड एक LINQ क्वेरी का उपयोग कर फ़िल्टर कर दिया जाएगा पर आधारित है कि है। डेटाबेस में क्षेत्र नल मानों की अनुमति देता है। अब अगर मैं जहां खंड में == ऑपरेटर का उपयोग क्षेत्रों की तुलना, एसक्यूएल उत्सर्जित गलत है (यह नहीं की तुलना के लिए IS NULL का उपयोग करता है), और इसलिए पैदावार 0 परिणाम क्वेरी। मैंने इसे Object.Equals() विधि का उपयोग करके हल किया। यह काम करता है, लेकिन अब मुझे गैर नल मान पास करने पर एक अपवाद मिलता है, एक पूर्णांक

'System.Object' प्रकार का निरंतर मान बनाने में असमर्थ। इस संदर्भ में केवल प्राचीन प्रकार या गणना प्रकार समर्थित हैं।

तो मैं एक साधारण विधि

using (TestEntities context = new Entities()) 
{ 
    return from c in context.ItemMappings 
      where c.ParentID.Equals(parentID) 
      select new ItemDTO 
      { 
       ItemID = c.Item.ItemID, 
       ItemName = c.Item.ItemName, 
       ItemType = new ItemTypeDTO 
       { 
        TypeID = c.Item.Type.TypeID, 
        TypeName =c.Item.Type.TypeName 
       }; 
} 

उत्तर

3

हाँ आपकी समस्या को भी अगर यह एसक्यूएल है घटित होता लिखा था। आपको स्पष्ट रूप से शून्य को संभालना होगा, और यह काम करना चाहिए:

Where (parentID == null && c.ParentID == null) || (parentID == c.ParentID) 

यह मानता है कि आप मिलान करने के लिए एक शून्य चाहते हैं। आप सभी परिणाम फ़िल्टर न की गई वापस जाने के लिए, बजाय अशक्त चाहते हैं कार्य करें:

Where (parentID == null) || (parentID != null && parentID == c.ParentID) 
:

Where (parentID == null) || (parentID == c.ParentID) 

मैं भी कभी कभी इस समस्या आई है, और पाया रास्ता LINQ सही ढंग से हर समय अनुवाद होगा करने के लिए था

इसका कारण यह है भी एसक्यूएल में, यदि आप जहां ParentID = @ParentID, एक अशक्त मैच का कोई परिणाम देता है करते हैं, और आप ISNULL उपयोग करने के लिए खाली करने के लिए इसे से बचने के लिए किया है।

+0

मैं एक समय में है कि कोशिश करता हूँ, और मुझे लगता है कि यह काम करेगा की ओर देखकर उसे पता है। Btw, मैं तर्क है कि मैं एसक्यूएल में एक ही मुद्दा मिल जाएगा समझते हैं, लेकिन सोचा था कि LINQ इंजन सही मेरी मूल्य के आधार पर एसक्यूएल फेंकना होगा। मैं अपवाद है कि मैं Object.Equals –

+0

मुझे लगता है कि त्रुटि की विशेषताओं के बारे में सुनिश्चित नहीं कर रहा हूँ का उपयोग करते समय मिल गया के बारे में अधिक भ्रमित किया गया था; वह मेरे लिए एक नया है ... दुर्भाग्यवश ईएफ एसक्यूएल प्रश्नों में उन प्रकार के अनुकूलन को देखने के लिए नहीं देखता है। –

1

नल आप भी इस

GSectionID = emp.SectionID ?? Guid.Empty, 
1

EF6 में आप इस समस्या को हल करने के लिए UseCSharpNullComparisonBehavior उपयोग कर सकते हैं की तरह कोशिश कर सकते हैं अनुमति देने के लिए। आपको संदर्भ विकल्प UseCSharpNullComparisonBehavior को सत्य पर सेट करने की आवश्यकता है और यह सी # की तरह व्यवहार करने जा रहा है।

objectContext.ContextOptions.UseCSharpNullComparisonBehavior = true; 

आप नीचे दिए गए लिंक में और अधिक देख सकते हैं: http://entityframework.codeplex.com/workitem/145

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