2010-03-12 14 views
12

मैं SQL सर्वर 2005 का उपयोग कर रहा है, एक केस संवेदी डेटाबेस के साथ ..Linq: Ntext खेतों पर ToLower() का उपयोग कर

एक खोज समारोह में, मैं संस्थाओं के लिए एक Linq बनाने की जरूरत (L2E) क्वेरी एक "कहाँ" खंड है कि इन नियमों के साथ डेटाबेस में डेटा के साथ कई तार की तुलना के साथ: के रूप में स्ट्रिंग के शामिल आसान() विधि में अनुमति दी है:

  1. तुलना एक "शामिल" मोड, सख्त नहीं की तुलना L2E
  2. तुलना केस असंवेदनशील होना चाहिए: मैं एक असंवेदनशील तुलना करने के लिए दोनों तत्वों पर ToLower() का उपयोग करता हूं।

यह सब वास्तव में अच्छा प्रदर्शन करता है, लेकिन मैं निम्नलिखित अपवाद में भाग: मेरी क्षेत्रों में से एक पर "तर्क डेटा प्रकार ntext कम समारोह के तर्क 1 के लिए अमान्य है"।

ऐसा लगता है कि फ़ील्ड एक NText फ़ील्ड है और मैं उस पर एक ToLower() नहीं कर सकता।
मैं उस NText फ़ील्ड पर केस असंवेदनशील कंटेनर() करने में सक्षम होने के लिए क्या कर सकता हूं?

उत्तर

26

केस-असंवेदनशील तुलना करने के लिए कभी भी .ToLower() का उपयोग न करें। यहां बताया गया है:

  1. यह संभवतः गलत है (आपका ग्राहक संयोजन हो सकता है, कह सकता है, तुर्की, और आपका डीबी संयोजन नहीं हो सकता है)।
  2. यह अत्यधिक अक्षम है; एसक्यूएल उत्सर्जित के बजाय केस-असंवेदनशील संयोजन के साथ LOWER है।

इसके बजाय, StringComparison.OrdinalIgnoreCase या StringComparison.CurrentCultureIgnoreCase का उपयोग करें:

var q = from f in Context.Foos 
     where f.Bar.Equals("hi", StringComparison.OrdinalIgnoreCase) 
     select f; 

लेकिन Contains() के लिए एक समस्या है: Equals, StartsWith, आदि के विपरीत, यह एक StringComparison तर्क के लिए एक अधिभार नहीं है। क्यूं कर? अच्छा प्रश्न; माइक्रोसॉफ्ट से पूछो

कि, LOWER पर SQL सर्वर की सीमा के साथ संयुक्त का अर्थ है कि आप जो चाहते हैं उसे करने का कोई आसान तरीका नहीं है।

संभावित समाधानों शामिल हो सकता है:

  • एक पूरा टेक्स्ट सूचकांक का उपयोग करें, और एक प्रक्रिया में खोज करते हैं।
  • उपयोग Equals या StartsWith बजाय, यदि संभव हो तो अपने कार्य
  • बदलें स्तंभ का डिफ़ॉल्ट मिलान के लिए?
+0

हम ... मैं क्या आप मुझे बता कि ToLower() का उपयोग गलत है लगता है, लेकिन मैं कोई अन्य समाधान है के रूप में: - मिलान बदलने बहुत ज्यादा काम और जोखिम बस कुछ खोज मापदंड के लिए है - बराबर और StartsWith जीता यहां आवश्यकता के अनुरूप नहीं है। मैं NText फ़ील्ड को NVarchar में परिवर्तित करने और उपयोगकर्ता इनपुट को सीमित करने के बारे में सोच रहा हूं ... मेरे मामले में प्रदर्शन वास्तव में महत्वपूर्ण नहीं है। –

+0

मैं आपको यह बताने की कोशिश कर रहा हूं कि विकल्प क्या हैं, यह नहीं बताते कि आपके लिए कुछ आदर्श विकल्प मौजूद हैं .... –

5

यहां एक लैम्ब्डा अभिव्यक्ति का उपयोग करें और एक मध्यस्थ सूची बनाएं जो निचले खंड को संभाल सके।

var q = Context.Foos.ToList().Where(s => s.Bar.ToLower().Contains("hi")); 

बहुत कुशल नहीं है, लेकिन यह काम करता है।आप अपने जहां खंड में अतिरिक्त विधेय है तो यह अपने लाभ के लिए काम करता है:

var q = Context.Foos.Where(p => p.f1 == "foo" && p.f2 == "bar"). 
      ToList().Where(s => s.Bar.ToLower().Contains("hi")); 
+1

यह इकाइयों के लिए लिंक है: लक्ष्य एक उपयुक्त SQL अनुरोध उत्पन्न करना है। आपका समाधान तालिका की सभी पंक्तियों (या अन्य मानदंडों के साथ फ़िल्टर की गई पंक्तियों) को पकड़ लेगा और फिर फ़िल्टर लागू करेगा। वास्तव में यह बिल्कुल कुशल नहीं है :)। लेकिन मैं मानता हूं कि यह काम करेगा! –

+1

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

+2

सहमत हुए, मैंने अभी इसका उल्लेख किया है कि इस तकनीक का उपयोग करने वाले नए लोग जानते हैं कि यह वास्तव में क्या करता है (मैं हमेशा यह देखकर आश्चर्यचकित हूं कि कितने लोग नीचे क्या होता है यह जानने के बिना एल 2 ई का उपयोग करते हैं)। तो बड़ी टेबल के साथ, यह एक महत्वपूर्ण प्रदर्शन/स्मृति प्रभाव हो सकता है। मेरे मामले में, प्रदर्शन महत्वपूर्ण नहीं था। –

0

हम में जाना जाता है के रूप में, यह एक बहुत ही "bugged" स्थिति है। और यह मुझे बहुत खराब करता है।

आज, मैं के रूप में एक दृश्य बनाने के लिए तय:

चयन * TableName जहां theColumn '% कुंजी%' की तरह

तो एफई में इस दृश्य लोड से।

जीवन आसान हो रहा है!

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