2010-01-19 15 views
20

मैं linq-to-sql के साथ एक अजीब समस्या में आया था। निम्न उदाहरण में,लिंक जहां कॉलम == (शून्य संदर्भ) कॉलम के समान नहीं है == शून्य

var survey = (from s in dbContext.crmc_Surveys 
            where (s.crmc_Retail_Trade_Id == tradeId) && (s.State_.Equals(state)) 
            select s).First(); 

तो tradeId अशक्त है, यह

var survey = (from s in dbContext.crmc_Surveys 
            where (s.crmc_Retail_Trade_Id == null) && (s.State_.Equals(state)) 
            select s).First(); 

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

उत्तर

26

बदलें where (s.crmc_Retail_Trade_Id == tradeId)

where (s.crmc_Retail_Trade_Id == tradeId || 
     (tradeId == null && s.crmc_Retail_Trade_Id == null)) 

को संपादित करें - Brant Lamborn द्वारा this post पर आधारित है, यह निम्नलिखित की तरह लग रहा है कि तुम क्या चाहते हो जाएगा:

where (object.Equals(s.crmc_Retail_Trade_Id, tradeId)) 

Null Semantics (LINQ to SQL) MSDN पेज कुछ दिलचस्प करने के लिए लिंक जानकारी:

LIN एसक्यूएल के लिए क्यू सी # नल या एसक्यूएल पर विजुअल बेसिक कुछ भी तुलना अर्थशास्त्र लागू नहीं करता है। तुलना ऑपरेटर को उनके SQL समकक्षों में वाक्यबद्ध रूप से अनुवादित किया गया है। अर्थशास्त्र सर्वर या कनेक्शन सेटिंग्स द्वारा परिभाषित एसक्यूएल semantics प्रतिबिंबित करता है। दो शून्य मान डिफ़ॉल्ट SQL सर्वर सेटिंग्स के तहत असमान माना जाता है (हालांकि आप अर्थशास्त्र को बदलने के लिए सेटिंग्स को बदल सकते हैं)। भले ही, LINQ से SQL क्वेरी अनुवाद में सर्वर सेटिंग्स पर विचार नहीं करता है।

शाब्दिक अशक्त (कुछ नहीं) के साथ एक तुलना उचित एसक्यूएल संस्करण के लिए अनुवाद किया है (शून्य है या अशक्त नहीं है)।

में शून्य (कुछ नहीं) का मूल्य एसक्यूएल सर्वर द्वारा परिभाषित किया गया है; LINQ से SQL संयोजन को परिवर्तित नहीं करता है।

+1

हां, मुझे लगता है कि यह स्पष्ट उत्तर है। लेकिन दिमाग की पूछताछ जानना चाहती है कि स्थिर निरंतर शून्य के संकेत वाले चर से भिन्न क्यों है। – Boog

+0

मुझे संदेह है कि जोएल कोहेउर्न सही है कि आपके प्रश्न में दूसरा मामला एक एसक्यूएल क्वेरी में अनुवादित हो जाता है जो सीधे शून्य निर्दिष्ट करता है। – jball

+0

यह माइक्रोसॉफ्ट के लिनक्स पार्सर में बहुत बड़ी गड़बड़ी या यहां तक ​​कि बग की तरह लगता है जो शून्य ऑब्जेक्ट संदर्भों को उचित रूप से संभाल नहीं सकता है, लेकिन मैं इसके लिए आपके शब्द ले जाऊंगा। – Boog

2

इस पर कोई यकीन नहीं है, लेकिन मुझे संदेह है कि जब linq-to-sql एक एसक्यूएल क्वेरी स्ट्रिंग में अनुवाद करता है तो आपको थोड़ा अलग अभिव्यक्ति मिलती है null सीधे इस तरह कि कुछ बिंदु पर आप न्यूल की तुलना में स्वयं की तुलना करते हैं, और NULL = NULL को गलत होने के लिए परिभाषित किया गया है।

+1

जब तक ANSI_NULLS बंद नहीं हो जाता है। लेकिन यह ब्रह्मांड को फेंकने का कारण बनता है। – womp

1

मैं Linq से परिचित नहीं हूँ, लेकिन सामान्य रूप में:

NULL एक लापता अज्ञात, या अपरिभाषित मूल्य का प्रतिनिधित्व करता। कड़ाई से बोलते हुए, एक चर NULL के बराबर नहीं हो सकता है; कम-लवली भाषाएं जो इस निर्माण को प्रदान करती हैं, आमतौर पर सुविधा के रूप में ऐसा करती हैं क्योंकि कोई आसान विकल्प नहीं है - उच्च स्तर पर ISNULL, defined, या जो भी आपकी भाषा की आपूर्ति करता है, पर भरोसा करना बेहतर होता है।

एक अपरिभाषित चर किसी अन्य अपरिभाषित चर के बराबर नहीं है (और यह NULL == NULL पर लागू होता है)। जो सेल्को के पास उन सभी लोगों को ढूंढने के लिए एक प्रश्न लिखने का एक अच्छा उदाहरण है जिनके बालों का रंग उनके द्वारा चलाए जाने वाले वाहन के रंग से मेल खाता है।क्या यह प्रश्न एक गंजा आदमी से मेल खाना चाहिए जो हर जगह चलता है?

+1

मुझे लगता है कि यह काफी रक्षात्मक है कि एक आदमी के अस्तित्वहीन बाल के रंग को अपने अस्तित्वहीन कार के रंग में एक मैच माना जाता है। – jball

+0

निम्न स्तर, या उच्च स्तर की भाषाओं में, शून्य हेक्स मान 0x0 है और शून्य == शून्य सत्य है। अब मुझे पता है कि यह एसक्यूएल में सच नहीं है लेकिन सी # एसक्यूएल नहीं है, हम उम्मीद करते हैं कि यह पकड़ लें। लिंक-टू-एसक्यूएल को सी # उपयोगकर्ताओं के लिए एक अमूर्त माना जाता है। यदि आप मुझसे पूछते हैं कि एमएस ने पूच खराब कर दिया, तो क्या मैं गलत हूं? वास्तव में – Boog

+0

। मैं पूछताछ करने वाले दिमाग को समझाने की कोशिश कर रहा था जो जानना चाहता था कि क्यों एक निरंतर शून्य एक चर से भिन्न होता है। ज्यादातर मामलों में शून्य 0x0 के बराबर होती है, यदि आपको किसी मेमोरी सेगमेंट की शुरुआत में पॉइंटर की आवश्यकता होती है तो गंभीर समस्या होती है (शुक्र है कि अब कोई समस्या नहीं है)। मैं बराबर कहता हूं क्योंकि मुझे लगता है कि बराबर से एक सूक्ष्म अंतर है। यह कहने जैसा है कि 1.99 99 99 999 ... 2 के बराबर नहीं है, यह सिर्फ एक गणितीय असुविधा है कि वे एक ही मूल्य होने लगते हैं। – Duncan

2

इसे हल करने का एक और विकल्प, क्योंकि मैं इस समस्या से भी भाग गया।

where (tradeId == null ? s.crmc_Retail_Trade_Id == null : s.crmc_Retail_Trade_Id == tradeId) 
संबंधित मुद्दे