2009-12-05 14 views
5

मैं लिंक से एसक्यूएल स्ट्रिंग तुलनाओं पर विरोधाभासी स्पष्टीकरण पढ़ रहा हूं।लिंक से एसक्यूएल मामले असंवेदनशील समानता

मैं निम्न कार्य करें:

from p in db.People 
    where p.UserName=username 
    select p 

उपयोगकर्ता नाम = "जॉन"

मैं सही केस संवेदी परिणाम मिलता है। क्या लिंक डिफ़ॉल्ट रूप से ऐसा कर रहा है या यह SQL डेटाबेस में हो रहा है?

+0

क्या आप कुछ उद्धरण खो रहे हैं? परिवर्तनीय नामों के मामले को बदलने से परिणाम प्रभावित नहीं होते हैं। –

+0

जो मैं नहीं देखता था – zsharp

उत्तर

4

मुझे लगता है कि आप अपने डीबी परिवर्तनीय बिंदुओं के आधार पर विवादित परिणाम प्राप्त करते हैं और जहां तुलना वास्तव में निष्पादित की जाती है। यदि यह कर सकता है, तो linq क्वेरी का निर्माण करेगा और इसे SQL सर्वर पर भेज देगा। ऐसा लगता है आपके

where p.UserName.ToLower()=username.ToLower() 
+1

क्षमा करें, लेकिन यह बुरी सलाह है। p.UserName.ToLower() = username.OLower() एक SQL क्वेरी में अनुवाद करेगा जो एक पूर्ण तालिका स्कैन को मजबूर करेगा। इससे कोई फर्क नहीं पड़ता कि "लोग" तालिका छोटी है, लेकिन यदि यह एक बड़ी मेज है तो यह किसी भी इंडेक्स का उपयोग करने में सक्षम नहीं होगी जो 'उपयोगकर्ता नाम' कॉलम को कवर कर सकती है। – KristoferA

1

यह डेटाबेस पर निर्भर करता है। एसक्यूएल सर्वर 2008 स्ट्रिंग्स को केस-असंवेदनशील के रूप में मानता है, जिसमें इंडेक्स अभिव्यक्ति में उपयोग किया जाता है। लिंक ऐसा नहीं करता है।

on MSDN, या this article पढ़ें।

+2

केस संवेदनशीलता/असंवेदनशीलता आपके डेटाबेस में उपयोग किए जाने वाले संयोजन और/या शामिल कॉलम पर निर्भर है (SQL सर्वर स्थापित होने पर डिफ़ॉल्ट सेट होता है, लेकिन इसे कई स्थानों पर ओवरराइड किया जा सकता है, नीचे तक कॉलम स्तर)। – KristoferA

3

आपका नमूना क्वेरी को फोन करके केस संवेदी मजबूर मोटे तौर पर कुछ इस तरह से अनुवाद होगा सकता है:

चयन [t0] .col1, [t0] .col2, ..., [ t0] .coln [स्कीमा] से। [लोग] जहां [t0] .UserName = @ p0

... उपयोगकर्ता नाम वैरिएबल के मान @ p0 एसक्यूएल चर में पारित हो जाएगा। इस प्रकार, केस संवेदनशीलता, उच्चारण संवेदनशीलता इत्यादि को उस संयोजन द्वारा नियंत्रित किया जाता है जिसे आपने उपयोग करने के लिए अपना SQL सर्वर इंस्टेंस/डीबी/टेबल/कॉलम सेट किया है। यदि कहीं और निर्दिष्ट नहीं किया गया है, तो डीबी या डीबी इंस्टेंस के डिफ़ॉल्ट संयोजन का उपयोग किया जाता है, लेकिन कॉलम स्तर पर कॉलेशन को सभी तरह से निर्दिष्ट किया जा सकता है।

अधिकांश लोग एसक्यूएल सर्वर को असंवेदनशील (सीआई) collations के साथ चलाते हैं, लेकिन जैसा कि मैंने उपरोक्त कहा है, इसे डीबी में ओवरराइड किया जा सकता है ताकि आपको यह जांचने की आवश्यकता हो कि आपके पास क्या संयोजन है।

यह आपके विपरीत है यदि आप L2O (ऑब्जेक्ट्स के लिए linq) क्वेरी के समान काम करते हैं, तो उस मामले में केस-सेंसिटीविटी डिफ़ॉल्ट है और आपको string.equals ओवरराइड का उपयोग कर केस असंवेदनशील बनाना होगा जो आपको संस्कृति और/या केस असंवेदनशीलता निर्दिष्ट करने की अनुमति देता है ...

+0

स्ट्रिंग.क्वल्स ओवरराइड का उपयोग नहीं करेगा, वही समस्या है जिस पर आपने मेरे परिणाम के साथ टिप्पणी की थी? तुलना करने के लिए सभी रिकॉर्ड्स को linq पक्ष में आने के लिए मजबूर करें? –

+0

@ जेफ, स्ट्रिंग.क्वल्स संदर्भ केवल एल 2 एस और एल 2 ओ के व्यवहार के बीच तुलना था, माफ करना, अगर मैं उस बिंदु पर स्पष्ट नहीं था। लेकिन हां, यदि आप दोनों को गठबंधन करेंगे और क्लाइंट साइड पर एल 2 ओ क्वेरी के रूप में मूल्यांकन करेंगे तो यह न केवल सभी रिकॉर्ड प्राप्त करेगा बल्कि उन्हें तार पर भी भेज देगा। दूसरे शब्दों में, सही संयोजन का उपयोग करना यहां महत्वपूर्ण है। आपके उत्तर का उदाहरण अभी भी डेटाबेस में मूल्यांकन किया जाएगा, लेकिन बाएं हाथ की ओर फ़ंक्शन कॉल रैपर के कारण तालिका स्कैन के अतिरिक्त ओवरहेड के साथ जहां खंड अनुमानित है। – KristoferA

+0

प्रतिक्रिया के लिए धन्यवाद (मैंने +1 को दिया जब मैंने पिछली टिप्पणी की थी) –

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