در حال کار بر روی یک پروژه از نوع Asp.net Core 2.2 هستم. در بخشی از پروژه قصد دارم یک جستجو با استفاده از دستورات Entity Framework ایجاد کنم.
برای ایجاد جستجو با استفاده از دستورات Entity Framework از دستور زیر استفاده کردم.
var Query = (from a in _db.Users.Where(u => u.firstname.Contains(searchValue))).ToList();
در این دستور از متد Contains برای پیدا کردن تمامی زیررشته های مشابه استفاده کردم. (چیزی مشابه با Like در دستورات T-Sql)
شرح مشکل
اما برای ایجاد جستجو یک مشکل دارم. فرض کنید 2 کاربر در جدول Users ایجاد شده باشند. نام یکی از کاربران hasan ذخیره شده و نام کاربر دیگه Hasan. یعنی نام این کاربران در حرف اول از لحاظ بزرگی یا کوچکی متفاوت هست. حالا وقتی جستجو انجام میشه اگر کلمه جستجو شده hasan باشه فقط ردیفی پیدا میشه که hasan هست و اگر Hasan جستجو بشه هم فقط ردیفی پیدا میشه که Hasan هست.
مشکل بزرگتر این هست که اگر مثلا HASAN جستجو بشه هیچ اطلاعاتی نمایش داده نمیشه. یعنی به عبارتی این دستورات به حروف بزرگ و کوچک حساس هستن.
حالا سوال این هست که چطوری میتونم یک جستجو با استفاده از دستورات Entity Framework ایجاد کنم که حساس به حروف بزرگ و کوچک نباشه و به عبارتی Case Insensitive باشه ؟
یه سری سرچ توی گوگل هم کردم و لینکهایی رو خوندم اما نتیجه مثبتی یافت نکردم.
کافیه توی گوگل سرچ کنید create search case insensitive ef و نتایج زیادی برای جستجو با استفاده از دستورات Entity Framework که حساس به حروف بزرگ و کوچک نباشن میاره. اما در ادامه براتون توضیح میدم که چجوری یک چستچو در رشته ها با استفاده از دستورات انتیتی فریم ورک ایجاد کنید.
فرق بین IEnumerable و IQueryable
یک نکته مهم در هنگام جستجو این هست که شما نتایج حاصل از جستجو رو یا باید در یک List از نوع IEnumerable ذخیره کنید و یا یک List از نوه IQueryable. اما فرق این دو هنگام جستجو چی هست؟
بهتر هست که نتایج جستجو رو داخل یک List از نوع IQueryable ذخیره کنید چون این نوع عملیات جستجو رو در سمت دیتابیس انجام میده و نتیجه رو به عنوان خروجی دریافت میکنه که خودش در بزرگ بودن یا کوچک بودن حروف موثر هست. اما در IEnumerable جستجو و فیلتر سمت سرور انجام میشه. یعنی نتایج کامل از دیتابیس دریافت میشه و نتایج دریافت شده فیلتر میشه.
این نکته ای بود که لازم بود بدونید. در تصویر زیر نحوه کار Inumerable رو مشاهده می کنید
و در تصویر زیر هم روش کار IQueryable رو میتونید مشاهده کنید
البته موارد بالا ممکنه مشکل شما رو حل نکنن و برای رفع مشکل شما 2 راه حل معرفی می کنم.
استفاده از تابع ToLower
شما میتونید توی کوئری خودتون با استفاده از تابع ToLower هم عبارت سرچ شده رو به صورت حروف کوچک تبدیل کنید و هم نتایج حاصل از اجرای کوئری در دیتابیس رو. برای این منظور میتونید از کد زیر استفاده کنید
var Query = (from a in _db.Users.Where(u => u.firstname.ToLower().Contains(searchValue.ToLower()))).ToList();
در این صورت تمامی نتایج برگشتی از سمت دیتابیس به صورت حروف کوچک میشن و کلمه سرچ شده هم تبدیل به حروف کوچک میشه و جستجو در همه ردیف ها به درستی انجام میشه.
استفاده از ToUpper
با استفاده از دستور ToUpper هم میشه دقیقا جستجو رو فارغ از بزرگ یا کوچک بودن حروف انجام داد. این دستور هم مثل دستور ToLower هست با این تفاوت که عبارت جستجو شده و نتایج حاصل از جستجو رو به حروف بزرگ تبدیل میکنه و جستجو رو انجام میده. به قطعه کد زیر دقت کنید
var Query = (from a in _db.Users.Where(u => u.firstname.ToUpper().Contains(searchValue.ToUpper()))).ToList();
به این ترتیب می تونید به راحتی جستجو با استفاده از دستورات Entity Framework رو بدون در نظر گرفتن بزرگی یا کوچکی حروف انجام بدید.
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
44
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
83
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
425
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1346
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1156
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
593
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
204
- پاسخ :
1
|
تاریخ :
1403/07/26
- ساعت :
09:00:00 PM
- بازدید :
115
- پاسخ :
0
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
44
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
83
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
425
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
929
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1346
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1156
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
593
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
204
- پاسخ :
1
|