यह कोड संवेदनशील है, इसे असंवेदनशील कैसे बनाया जाए?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
यह कोड संवेदनशील है, इसे असंवेदनशील कैसे बनाया जाए?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
जवाबों:
यह मानते हुए कि हम यहां स्ट्रिंग्स के साथ काम कर रहे हैं, यहां एक और "सुरुचिपूर्ण" समाधान का उपयोग कर रहे हैं IndexOf()
।
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION
.IndexOf(description, StringComparison.OrdinalIgnoreCase) != -1);
}
fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())
IEqualityComparer<string>
तुलनात्मकता कैसे काम करेगी, इसे संभालने के लिए विशेषता का उपयोग करना चाहिए । समानता की जाँच करने के लिए ToLower और ToUpper का उपयोग करना एक बुरा विचार है। प्रयास करें: .Contains(description, StringComparer.CurrentCultureIgnoreCase)
उदाहरण के लिए
Error 1 'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments
Contains
साथ StringComparer
पैरामीटर के रूप में स्ट्रिंग प्राप्त नहीं होता है, तो यह निर्माण त्रुटि हो जाएगा। IndexOf
पर Queryable
शायद एसक्यूएल में अनुवाद नहीं किया जा सकता है। व्यक्तिगत रूप से मुझे यह उत्तर पूरी तरह से मान्य लगा क्योंकि हम डेटाबेस में LINQ के बारे में बोलते हैं।
यदि LINQ क्वेरी को डेटाबेस संदर्भ में निष्पादित Contains()
किया जाता है, तो LIKE
ऑपरेटर को कॉल करने के लिए मैप किया जाता है :
.Where(a => a.Field.Contains("hello"))
बन जाता है Field LIKE '%hello%'
। LIKE
ऑपरेटर डिफ़ॉल्ट रूप से केस संवेदी है, लेकिन उस से बदला जा सकता स्तंभ का मिलान बदल रहा है ।
यदि LINQ क्वेरी को .NET संदर्भ में निष्पादित किया जाता है, तो आप IndexOf () का उपयोग कर सकते हैं , लेकिन यह विधि LINQ से SQL में समर्थित नहीं है।
LINQ to SQL एक तरीके का समर्थन नहीं करता है जो कि CultureInfo को पैरामीटर के रूप में लेता है, शायद इसलिए यह गारंटी नहीं दे सकता है कि SQL सर्वर संस्कृतियों को उसी .NET के रूप में संभालता है। यह पूरी तरह सच नहीं है, क्योंकि यह समर्थन करता हैStartsWith(string, StringComparison)
।
हालांकि, यह एक ऐसी विधि का समर्थन नहीं करता है जो LIKE
LINQ से SQL में मूल्यांकन करता है, और .NET में असंवेदनशील तुलना के मामले में, असंवेदनशील समसामयिक तरीके से केस असंवेदनशील () करना असंभव बनाता है।
insensitive
खोज करने की आवश्यकता है , और दूसरे में मुझे इसकी आवश्यकता है case sensitive
। क्या मुझे केवल प्रदर्शन की दस्तक लेनी है और 'tolower ()' का उपयोग करना है?
यहाँ स्वीकार किए गए उत्तर में इस तथ्य का उल्लेख नहीं है कि यदि आपके पास एक अशक्त स्ट्रिंग टोलवर () है, तो एक अपवाद फेंक देंगे। सुरक्षित तरीका यह करना होगा:
fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())
LINQ के लिए, वस्तुओं के लिए C # 6.0 (जो अभिव्यक्ति शारीरिक कार्यों और अशक्त प्रचार की अनुमति देता है) का उपयोग करते हुए, इसे इस तरह एक पंक्ति में भी किया जा सकता है (नल के लिए जाँच)
public static bool ContainsInsensitive(this string str, string value) => str?.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;
IndexOf इस मामले में सबसे अच्छा काम करता है
return this
.ObjectContext
.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase)>=0);
आप string.Compare का उपयोग कर सकते हैं
lst.Where(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0);
यदि आप जांच करना चाहते हैं तो "Any" का उपयोग करें
lst.Any(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0)
public static bool Contains(this string input, string findMe, StringComparison comparisonType)
{
return String.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1;
}
StringComparison.InvariantCultureIgnoreCase सिर्फ मेरे लिए काम करते हैं:
.Where(fi => fi.DESCRIPTION.Contains(description, StringComparison.InvariantCultureIgnoreCase));
ईमानदारी से, यह मुश्किल होने की जरूरत नहीं है। ऐसा लगता है कि शुरुआत में हो सकता है, लेकिन ऐसा नहीं है। यहाँ C # में एक साधारण linq क्वेरी है जो कि अनुरोध के अनुसार है।
मेरे उदाहरण में, मैं उन व्यक्तियों की सूची के खिलाफ काम कर रहा हूं जिनके पास FirstName नामक एक संपत्ति है।
var results = ClientsRepository().Where(c => c.FirstName.ToLower().Contains(searchText.ToLower())).ToList();
यह लोअर केस सर्च पर डेटाबेस सर्च करेगा लेकिन फुल केस रिजल्ट लौटाएगा।
स्ट्रिंग विधि का उपयोग करें
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION
.Equals(description, StringComparison.OrdinalIgnoreCase));
}