यह EF कोर के पुराने संस्करणों के मामले में हुआ करता था। अब string.Contains
केस संवेदनशील है, और उदाहरण के लिए sqlite के लिए यह sqlite फ़ंक्शन `instr ()' (मैं पोस्टग्रेस्क्ल के लिए नहीं जानता) पर मैप करता हूं।
यदि आप स्ट्रिंग्स की तुलना केस-असंवेदनशील तरीके से करना चाहते हैं, तो आपके पास कार्य करने के लिए DbFunctions हैं।
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();
@Gert को अपडेट करें:
प्रश्न में धारणा का एक हिस्सा गलत है। string.Contains
LIKE expression
. में परिवर्तित नहीं होता है भले ही यह एफई कोर संस्करणों <=1.0 (मुझे लगता है) में मामला हुआ करता था।
- SQLServer में
string.contains
CHARINDEX()
. में कनवर्ट करता है , oracle और sqlite मेंinstr()
. में जो डिफ़ॉल्ट रूप से केस सेंसिटिव होते हैं UNLESS db या कॉलम कॉलेशन को अन्यथा परिभाषित किया जाता है (फिर से, मुझे postgresql के बारे में पता नहीं है)। - सभी मामलों में
EF.Functions.Like()
एक SQLLIKE
. में कनवर्ट करता है अभिव्यक्ति जो डिफ़ॉल्ट रूप से केस-असंवेदनशील है जब तक कि डीबी या कॉलम संयोजन को अन्यथा परिभाषित नहीं किया जाता है।
तो हाँ यह सब संयोजन के लिए नीचे जाता है लेकिन - अगर मैं गलत हूं तो मुझे सुधारें - एक तरह से कोड केस-संवेदी/असंवेदनशील खोज पर प्रभाव डाल सकता है, जिसके आधार पर आप उपरोक्त में से किसी एक विधि का उपयोग करते हैं।
अब, मैं पूरी तरह से अद्यतित नहीं हो सकता, लेकिन मुझे नहीं लगता कि ईएफ कोर माइग्रेशन स्वाभाविक रूप से डीबी संयोजन के साथ सौदा करते हैं और जब तक आप पहले से ही तालिका को मैन्युअल रूप से नहीं बनाते हैं, तो आप डिफ़ॉल्ट संयोजन के साथ समाप्त हो जाएंगे (एसक्लाइट के लिए केस-संवेदी और मैं ईमानदारी से दूसरों के लिए नहीं जानते)।
मूल प्रश्न पर वापस जाना आपके पास इस केस-असंवेदनशील खोज को करने के लिए कम से कम 2 विकल्प हैं यदि भविष्य में रिलीज में 3 नहीं:
- इस ट्रिक का उपयोग करके DbContext.OnModelCreating() का उपयोग करके निर्माण पर कॉलम कोलाज निर्दिष्ट करें
- अपना
string.Contains
बदलें द्वाराEF.Functions.Like()
- या अभी भी चर्चा में एक आशाजनक विशेषता की प्रतीक्षा करें:
EF.Functions.Collate()
समारोह