2011-02-24 20 views
5

स्थिति के आधार पर LINQ केस संवेदनशील और मामला संवेदनशील कैसे बनाएं?LINQ केस संवेदनशील

मैं एसक्यूएल सर्वर 2008 और इकाई फ्रेमवर्क 4.0 का उपयोग कर रहा हूं।

मैंने SQL सर्वर केस संवेदनशील बनाने के लिए COLLATION को बदल दिया। ताकि इनके परिदृश्यों के लिए:

query = query.Where(x => x.Username == username); 

यह बहुत अच्छा काम करता है।

query = query.Where(x => (x.Name.Contains(Name))); 

जो जब रिकॉर्ड "TestString" है काम नहीं करता है और मैं: हालांकि मैं डेटा बाहर निकलने के लिए डाटाबेस से मामले अनदेखी जब इतनी तरह विषय (या नाम या समान) से खोज में सक्षम होना चाहिए मैं "परीक्षण" या "टेस्ट" या इसी तरह की तलाश में हूं। मैं इसे कैसे बनाऊंगा ताकि जब किसी पाठ में स्ट्रिंग का टेक्स्ट या भाग मिले? धन्यवाद

+0

संभवतः संबंधित: http://stackoverflow.com/questions/3843060/linq-to-entities-case-sensitive-comparison –

+0

toupper/लोअर समाधान का प्रयोग करें या इस तरह की एक SQL क्वेरी के बजाय लिखें: 'का चयन करें * TblUser से जहां tblUser.userName = 'test' COLLATE Finnish_Swedish_CI_AS' – Magnus

उत्तर

10

LINQ में केस संवेदनशीलता की कोई अवधारणा नहीं है, यह केवल बूलियन मूल्यांकन की परवाह करता है। तो अगर आप मामले को अनदेखा करना चाहते हैं, तो आप की तरह कुछ करना चाहिए:

query = query.Where(x => (x.Name.ToLower().Contains(Name.ToLower()))); 

संभावना है कि आप ToLower() के लिए एक CultureInfo पारित करने के लिए (या ToLowerInvariant() का उपयोग करें) चाहते हैं हैं, और आप Name.ToLower() का परिणाम कैश करने के लिए चाहते हो सकता है इसलिए उस ऑपरेशन को संभावित रूप से बड़ी संख्या में करने की ज़रूरत नहीं है, लेकिन यह आपको शुरू करना चाहिए।

0

यह करने के लिए मेरा जवाब पढ़ें:

String.Equals() not working as intended

यह जबाब आप चाहते थे,

आह नहीं है शायद :-) ... और आप इसी मामले में बदलने के लिए है, तो तुलना करने के लिए, ToUpper ToLower से बेहतर है। मुझसे मत पूछो क्यों। लेकिन आप यहां पढ़ सकते हैं: Case insensitive string compare in LINQ-to-SQL

1

Queryable.Contains में एक अधिभार है जो IEqualityComparer<T> तुलना के लिए उपयोग किया जाता है। msdn देखें। यदि आप एक केस असंवेदनशील तुलनाकर्ता की आपूर्ति करते हैं, तो यह काम करना चाहिए - मुझे पूरा यकीन है कि पहले से ही ढांचे में एक है।

+0

मुझे लगता है कि IEqualityComparer केवल लिंक में ऑब्जेक्ट्स में समर्थित है – Magnus

5
query = query.Where(x => string.Equals(x.Name, Name, StringComparison.CurrentCultureIgnoreCase)); 
संबंधित मुद्दे