এই কোডটি কেস সংবেদনশীল, কীভাবে এটি কে সংবেদনশীল করবেন?
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
সম্ভবত এসকিউএল অনুদিত করা যাবে না। ব্যক্তিগতভাবে আমি এই উত্তরটি সম্পূর্ণ বৈধ বলে মনে করেছি যেহেতু আমরা লিনকিউ সম্পর্কে ডেটাবেজে কথা বলি।
যদি লিনকিউ ক্যোয়ারী ডেটাবেস প্রসঙ্গে কার্যকর Contains()
করা হয় তবে কলটিতে LIKE
অপারেটরের কাছে ম্যাপ করা হবে :
.Where(a => a.Field.Contains("hello"))
হয়ে Field LIKE '%hello%'
। LIKE
অপারেটর ডিফল্টরূপে ক্ষেত্রে অসংবেদী, কিন্তু যে পরিবর্তন করা যেতে পারে কলামের কোলেশন পরিবর্তন ।
যদি লিনকিউ ক্যোয়ারী .NET প্রসঙ্গে কার্যকর করা হয় তবে আপনি সূচিপত্র () ব্যবহার করতে পারেন তবে এই পদ্ধতিটি লিনকিউ থেকে এসকিউএল সমর্থিত নয়।
এসকিউএল-র লাইনকুই এমন সংস্করণগুলিকে সমর্থন করে না যা সংস্কৃতিআইনফোকে প্যারামিটার হিসাবে গ্রহণ করে, সম্ভবত এটি এটির গ্যারান্টি দিতে পারে না যে এসকিউএল সার্ভার সংস্কৃতিগুলিকে। নেট হিসাবে পরিচালনা করে। এটি সম্পূর্ণরূপে সত্য কারণ তা না হয়, না সমর্থন StartsWith(string, StringComparison)
।
যাইহোক, এটি এমন কোনও পদ্ধতির সমর্থন করে বলে মনে হয় না যা LIKE
LINQ তে এসকিউএল এবং NET এর ক্ষেত্রে একটি সংবেদনশীল তুলনা করে, যাতে ধারাবাহিক উপায়ে ক্ষেত্রে সংবেদনশীল কন্টেন্টগুলি () করা অসম্ভব হয়ে পড়ে।
insensitive
সন্ধান করতে হবে এবং অন্যটিতে আমার এটি হওয়া দরকার case sensitive
। আমাকে কি কেবল পারফরম্যান্সটি ছুঁড়ে নিতে হবে এবং 'টু লোয়ার ()' ব্যবহার করতে হবে?
এখানে গৃহীত উত্তরে এমন একটি সত্য উল্লেখ করা হয়নি যা আপনার কাছে নল স্ট্রিং থাকলে ToLower () ব্যতিক্রম করবে। নিরাপদ উপায়টি হ'ল:
fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())
সি # .0.০ (যা এক্সপ্রেশনটি দেহযুক্ত ক্রিয়াকলাপ এবং নাল প্রচারের অনুমতি দেয়) ব্যবহার করে, লিনকিউ থেকে অবজেক্টের জন্য এটি একক লাইনে এটি করা যেতে পারে (নাল পরীক্ষা করেও):
public static bool ContainsInsensitive(this string str, string value) => str?.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;
ইনডেক্সঅফ এক্ষেত্রে সেরা কাজ করে
return this
.ObjectContext
.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase)>=0);
আপনি স্ট্রিং ব্যবহার করতে পারেন। তুলনা করুন
lst.Where(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0);
আপনি যদি কেবল এটির পরীক্ষা করতে চান তবে "যে কোনও" ব্যবহার করুন
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;
}
স্ট্রিংক্যাম্পিরিশন.আইভাভারত সংস্কৃতিআইগনরেস কেবল আমার জন্য কাজটি করুন:
.Where(fi => fi.DESCRIPTION.Contains(description, StringComparison.InvariantCultureIgnoreCase));
সত্যিই, এটি কঠিন হওয়ার দরকার নেই। এটি শুরুতে মনে হতে পারে তবে এটি হয়নি। এখানে সি # তে একটি সাধারণ লিনক ক্যোয়ারী যা অনুরোধের মতো ঠিক করে দেয়।
আমার উদাহরণস্বরূপ, আমি এমন ব্যক্তির তালিকার বিরুদ্ধে কাজ করছি যার নাম ফার্স্টনেম বলে property
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));
}