লিনকিউতে কেস সংবেদনশীল থাকে


174

এই কোডটি কেস সংবেদনশীল, কীভাবে এটি কে সংবেদনশীল করবেন?

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}

সজোয়ার্ডের উত্তরগুলি সঠিক তবে ... আমি এবং তদ্বিপরীত লেখার সময় আমি তুরস্কের নামের সাথে অনুসন্ধানের ফলাফলগুলি পেতে চাই। (উদাহরণস্বরূপ)। এক্ষেত্রে টোলওয়ারটি যাওয়ার সঠিক উপায় বলে মনে হচ্ছে। আমি ভুল হলে আমাকে সংশোধন করুন। তুর্কী আমি: en.wikipedia.org/wiki/Dotted_and_dotless_I
তিনি Nrik

@ হের্রিক - যেমনটি জেল্টনের মন্তব্যে তুরস্ক টেস্টের লিঙ্কে যেমনটি গৃহীত উত্তরের অধীনে আলোচিত হয়েছে, তুর্কি সংস্কৃতির সাথে চলাকালীন, তখন এই দু'জনের আলাদা হবে - সুতরাং আপনি অন্যটির সাথে নাম খুঁজে পাবেন না। আপনি ToLowerInvariant চান। বিভিন্ন উত্তরের অধীনে আলোচনা এখানে দেখুন
টুলমেকারস্টেভ

এটি একটি পুরানো প্রশ্ন, তবে এটি লক্ষণীয় যে বর্তমান সংস্করণে EF কোর 2.0 টুলভার () নিম্নলিখিত ব্যক্তি হিসাবে কাজ করে W )); আমি পোস্টগ্র্রেস ডিবির বিপরীতে লিনক ক্যোয়ারিতে এটি ব্যবহার করছি। ডিবিতে কলামের সংযোগের বিষয়ে আমার কাছে সংবেদনশীলতা নেই এবং আমি পরীক্ষা করে দেখেছি যে ToLower () ছাড়া ম্যাচটি স্পষ্টভাবে সংবেদনশীল is
শেলপাইপির

উত্তর:


72

ধরে নিই আমরা এখানে স্ট্রিং নিয়ে কাজ করছি, এখানে আরও একটি "মার্জিত" সমাধান ব্যবহার করা হচ্ছে IndexOf()

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM
        .Where(fi => fi.DESCRIPTION
                       .IndexOf(description, StringComparison.OrdinalIgnoreCase) != -1);
}

7
খুশী হলাম। যদিও আমার নিজের উদ্দেশ্যে, এটি LINQ থেকে সত্তার পক্ষে কাজ করে না। লিনকিউ এর পক্ষে বস্তুর কাছে দুর্দান্ত সমাধান।
ড্যামিয়ান পাওয়েল

242
fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())

49
জোন স্কিটি সম্পর্কিত প্রশ্নে যেমন মন্তব্য করেছেন , এই পদ্ধতিটি তুরস্ক টেস্টটি পাস করবে না ।
জেলটন

5
না, তবে ডাটাবেসগুলি অক্ষর সেট এবং কোলেশন বন্ধ করে দেয়। আপনি যদি ডাটাবেসটিতে কাজ বন্ধ করার চেষ্টা করছেন, আপনি অক্ষর সেট এবং কোলেশন সম্পর্কে কিছু অনুমান করতে হবে, তাই না?
ক্রিস্টোফার স্টিভেনসন 12

66
IEqualityComparer<string>তুলনাটি কীভাবে কাজ করবে তা পরিচালনা করতে বৈশিষ্ট্যটি ব্যবহার করা উচিত । সমতা যাচাই করতে ToLower এবং ToUpper ব্যবহার করা একটি খারাপ ধারণা। চেষ্টা করুন: .Contains(description, StringComparer.CurrentCultureIgnoreCase)উদাহরণস্বরূপ
ডারিভাল

19
@ ডরিভালের মন্তব্যটি কার্যকরী নয়, কারণ এটি এই ত্রুটিযুক্ত মন্তব্যটি দেয়: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
ইমি

6
Containsসঙ্গে StringComparerপ্যারামিটার হিসাবে স্ট্রিং পাবেন না, তাই এটি বিল্ড-ত্রুটি হতে হবে। IndexOfউপর Queryableসম্ভবত এসকিউএল অনুদিত করা যাবে না। ব্যক্তিগতভাবে আমি এই উত্তরটি সম্পূর্ণ বৈধ বলে মনে করেছি যেহেতু আমরা লিনকিউ সম্পর্কে ডেটাবেজে কথা বলি।
থারিক নগ্রোহোতোমো

122

যদি লিনকিউ ক্যোয়ারী ডেটাবেস প্রসঙ্গে কার্যকর Contains()করা হয় তবে কলটিতে LIKEঅপারেটরের কাছে ম্যাপ করা হবে :

.Where(a => a.Field.Contains("hello")) হয়ে Field LIKE '%hello%'LIKEঅপারেটর ডিফল্টরূপে ক্ষেত্রে অসংবেদী, কিন্তু যে পরিবর্তন করা যেতে পারে কলামের কোলেশন পরিবর্তন

যদি লিনকিউ ক্যোয়ারী .NET প্রসঙ্গে কার্যকর করা হয় তবে আপনি সূচিপত্র () ব্যবহার করতে পারেন তবে এই পদ্ধতিটি লিনকিউ থেকে এসকিউএল সমর্থিত নয়।

এসকিউএল-র লাইনকুই এমন সংস্করণগুলিকে সমর্থন করে না যা সংস্কৃতিআইনফোকে প্যারামিটার হিসাবে গ্রহণ করে, সম্ভবত এটি এটির গ্যারান্টি দিতে পারে না যে এসকিউএল সার্ভার সংস্কৃতিগুলিকে। নেট হিসাবে পরিচালনা করে। এটি সম্পূর্ণরূপে সত্য কারণ তা না হয়, না সমর্থন StartsWith(string, StringComparison)

যাইহোক, এটি এমন কোনও পদ্ধতির সমর্থন করে বলে মনে হয় না যা LIKELINQ তে এসকিউএল এবং NET এর ক্ষেত্রে একটি সংবেদনশীল তুলনা করে, যাতে ধারাবাহিক উপায়ে ক্ষেত্রে সংবেদনশীল কন্টেন্টগুলি () করা অসম্ভব হয়ে পড়ে।


কেবল FYI EF 4.3 স্টার্টসইথকে সমর্থন করে না। আমি পেয়েছি: লিনকিউ থেকে সত্তা পদ্ধতিগুলি 'বুলিয়ান স্টার্টসইথ (সিস্টেম.স্ট্রিং, সিস্টেম.সড়িতকরণের তুলনা)'
নখলি

স্টার্ট উইথ লাইক 'হ্যালো%' এ রূপান্তর করে?
বার্ট ক্যালিক্সটো

ক্লিকডাটা লিঙ্কটি মারা গেছে।
অ্যাডাম পার্কিন


1
সুতরাং EF ব্যবহার করার সময় কী কী বিকল্প রয়েছে, এক প্রসঙ্গে আমার কেস insensitiveসন্ধান করতে হবে এবং অন্যটিতে আমার এটি হওয়া দরকার case sensitive। আমাকে কি কেবল পারফরম্যান্সটি ছুঁড়ে নিতে হবে এবং 'টু লোয়ার ()' ব্যবহার করতে হবে?
জাপানোলজিকা

12

এখানে গৃহীত উত্তরে এমন একটি সত্য উল্লেখ করা হয়নি যা আপনার কাছে নল স্ট্রিং থাকলে ToLower () ব্যতিক্রম করবে। নিরাপদ উপায়টি হ'ল:

fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())


@ অ্যালেক্সজুকভস্কি এই সমস্যাটির সাথে কীভাবে প্রাসঙ্গিক? যদি ফাই.ডি.এস.এস.পি.এস.টি শূন্য হয় বা বিবরণটি নাল হয় তবে আপনি একটি সি # নাল রেফারেন্স ব্যতিক্রম পাচ্ছেন। লিনকিউ ক্যোয়ারী এসকিউএল দিকে রূপান্তরিত করে তা বিবেচ্য নয়। এখানে তার প্রমাণ রয়েছে: dotnetfiddle.net/5pZ1dY
মার্কো

কারণ এই কোয়েরিটি এসকিউএলে অনুবাদ ব্যর্থ হবে কারণ এটি নাল কোয়েলশিং অপারেটরকে সমর্থন করে না। এবং আপনি সম্ভবত ক্লায়েন্ট পক্ষের নাল কোয়েলশিং ব্যবহার করতে সমস্ত এন্ট্রি লোড করার পরিবর্তে ডাটাবেস অনুসন্ধান করছেন। সুতরাং আপনি যদি এটি ব্যবহার করেন - এটি ক্লায়েন্টের পক্ষে ঠিক আছে তবে ডিবিতে ব্যর্থ হন, অন্যথায় আপনি ডিবিতে ঠিক আছেন এবং আপনি ক্লায়েন্টের পক্ষে নালারফের বিষয়ে চিন্তা করবেন না কারণ এটি ঘটবে না কারণ সি # এই কোয়েরিটি কার্যকর করে না এবং তা করে না আসলে নাল বস্তু পড়েন না।
অ্যালেক্স

এই উত্তরটি আমাকে লিনকিউ থেকে আমি যে সকল প্রতিষ্ঠানের কাছে যাচ্ছিলাম সে সমস্যার সমাধান করতে সহায়তা করেছে ndIndexOf এবং। একটি ডাটাবেস থেকে আসা স্ট্রিংয়ের মানটি শূন্য ছিল এমন একটি সংখ্যায় অন্তর্ভুক্ত। ফলাফল গণনা না করা পর্যন্ত আমি ত্রুটি পাচ্ছিলাম না এবং তারপরে আমার একটি ত্রুটি বার্তা পেল যে "অবজেক্টের রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা হয়নি।" আমি এই পোস্টটি না দেখে এটি কেন ঘটছে তা বুঝতে পারি না। ধন্যবাদ!
randyh22

7

সি # .0.০ (যা এক্সপ্রেশনটি দেহযুক্ত ক্রিয়াকলাপ এবং নাল প্রচারের অনুমতি দেয়) ব্যবহার করে, লিনকিউ থেকে অবজেক্টের জন্য এটি একক লাইনে এটি করা যেতে পারে (নাল পরীক্ষা করেও):

public static bool ContainsInsensitive(this string str, string value) => str?.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;

এটি কাজ করছে না কারণ কনটেনসআইনসেটিভ কোনও স্টোর কমান্ড নয়
সোভেন

@ সোভেন - হ্যাঁ, এটি কেবল লিনকিউ থেকে অবজেক্টের পক্ষে কাজ করে। আমি আমার উত্তর স্থির করেছি। ধন্যবাদ।
আলেক্সি


3

আপনি স্ট্রিং ব্যবহার করতে পারেন। তুলনা করুন

    lst.Where(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0);

আপনি যদি কেবল এটির পরীক্ষা করতে চান তবে "যে কোনও" ব্যবহার করুন

  lst.Any(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0)

এটি প্রশ্নের উত্তর দেয় না। স্ট্রিংয়ের মধ্যে একটি স্ট্রিং রয়েছে কিনা তা ওপি একটি স্ট্রিংয়ের মধ্যে (যেমন একটি স্ট্রিংতে অন্যটি থাকে) জিজ্ঞাসা করছে ।
অ্যান্ড্রুফ

1
public static bool Contains(this string input, string findMe, StringComparison comparisonType)
{
    return String.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1;
}

2
আমরা লিনক ক্যোয়ারিতে কাস্টম এক্সটেনশন পদ্ধতিগুলি ব্যবহার করতে পারি? তুমি কি নিশ্চিত ?
বিশাল শর্মা


0

সত্যিই, এটি কঠিন হওয়ার দরকার নেই। এটি শুরুতে মনে হতে পারে তবে এটি হয়নি। এখানে সি # তে একটি সাধারণ লিনক ক্যোয়ারী যা অনুরোধের মতো ঠিক করে দেয়।

আমার উদাহরণস্বরূপ, আমি এমন ব্যক্তির তালিকার বিরুদ্ধে কাজ করছি যার নাম ফার্স্টনেম বলে property

var results = ClientsRepository().Where(c => c.FirstName.ToLower().Contains(searchText.ToLower())).ToList();

এটি নিম্ন কেস অনুসন্ধানে ডাটাবেস অনুসন্ধান করবে তবে পুরো কেসের ফলাফল প্রত্যাবর্তন করবে।


-2

স্ট্রিং.একোয়ালস পদ্ধতি ব্যবহার করুন

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM
           .Where(fi => fi.DESCRIPTION
           .Equals(description, StringComparison.OrdinalIgnoreCase));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.