در این مقاله، ما قصد داریم به موضوع جستجو در ASP.NET Core Web API بپردازیم. جستجو یکی از قابلیتهایی است که سطح دشواری هنگام پیاده سازی آن، بسته به مشخصات شما بسیار متفاوت است.
اگر شما نیاز به پیاده سازی یک ویژگی جستجوی ساده دارید که فقط می خواهید یک فیلد را در پایگاه داده جستجو کنید، می توانید آن را به راحتی پیاده سازی کنید. از طرف دیگر ، اگر جستجوی شما، یک جستجوی چند منظوره چند ستونه باشد ، احتمالاً با برخی از کتابخانه های عالی برای جستجو مانند Lucene.NET که قبلاً بهینه شده و به اثبات رسیده اند ، بهترین نتیجه را خواهید گرفت.
نقطه شروع سورس برای این مقاله را میتوانید از اینجا و نقطه پایانی سورس را از اینجا دانلود کنید.
توجه: برای دنبال کردن این مقاله، کمی دانش پیشنیاز لازم است. اگر نحوه ایجاد دیتابیس یا نحوه کارکرد معماری مورد نظر را نمیدانید، به شدت توصیه میکنم که مقاله های مورد نظر را رصد نمایید.
در این مقاله، ما عناوین زیر را یاد میگیریم:
حالا بی معطلی، کارمان را شروع میکنیم.
جست و جو چیست؟
هیچ شکی و جود ندارد که شما فیلد جست و جو را در اکثر وبسایتهای اینترنتی دیده باشید.
زمانیکه با ساختار وبسایت آشنا باشیم یا اینکه یک وبسایت آنقدر بزرگ نباشد، آنگاه پیدا کردن هرچیزی در آن راحت است. اما ، اگر بخواهیم مرتبط ترین موضوع مدنظرمان را پیدا کنیم ، یا اگر نمی دانیم چه چیزی را میخواهیم پیدا کنیم ، یا شاید برای اولین بار است که از یک وب سایت بزرگ بازدید می کنیم ، احتمالاً قصد استفاده از فیلد جست و جو در آن سایت را داریم.
پیاده سازی جست و جوی پایه، کار سختی نیست، اما اگر ساده پیاده سازی شود، عملکرد جست و جو میتواند بی فایده باشد. بعضی اوقات بهتر است برای جست و جوی یک وبسایت، فقط به Google برگردید یا اینکه از google dork استفاده کنید.. اگر با Google dork ها آشنایی ندارید ، اکیداً توصیه می کنیم آنها را امتحان کنید.
در پروژه ساده ما، یک مورد قابل استفاده برای جست و جو، یافتن یک owner با استفاده از نام آن است.
حال ببینیم چطور میتوانیم به این منظور دست پیدا کنیم.
نحوه پیاده سازی جست و جو در ASP.NET Core Web API
از آنجایی که قصد داریم پایه ای ترین عملکرد جست و جو را در پروژه مان اجرا کنیم، از این رو، پیاده سازی آن اصلا پیچیده نخواهد بود. از آنجا که صفحه بندی و فیلترینگ را در مقاله های قبلی تحت پوشش قرار داده ایم، از این رو، تمام نیازهای زیرساختی را در اختیار داریم. فقط یک مقدار خیلی کم، پیاده سازیمان را توسعه میدهیم.
چیزی که میخواهیم به آن برسیم، همچین چیزی است:
1 |
https://localhost:5001/api/owners?name=Anna Bosh |
این فقط یک نتیجه باید برگرداند: Anna Bosh. البته، این جست و جو باید به همراه فیلترینگ و صفحه بندی کار کند. بنابراین، این یکی از چیزهایی است که باید آن را در نظر داشته باشیم.
مانند کاری که با فیلترینگ انجام دادیم، باید اول کلاس OwnerParameters مان را توسعه دهیم، زیرا باید کوئری جست و جویمان را به عنوان یک پارامتر کوئری ارسال کنیم:
1 2 3 4 5 6 7 8 9 10 |
public class OwnerParameters : QueryStringParameters { public uint MinYearOfBirth { get; set; } public uint MaxYearOfBirth { get; set; } = (uint)DateTime.Now.Year; public bool ValidYearRange => MaxYearOfBirth > MinYearOfBirth; //اضافه کردن این فیلد جدید برای جست و جو public string Name { get; set; } } |
ما یک ویژگی جدید اضافه کردیم – Name.
به همین سادگی.
حالا میتوانیم کوئریهایمان را با name=”عبارت” در آنها بنویسیم.
کار بعدی که باید انجام دهیم این است که فرآیند جست و جو را در کلاس OwnerRepository مان پیاده سازی کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public PagedList<Owner> GetOwners(OwnerParameters ownerParameters) { var owners = FindByCondition(o => o.DateOfBirth.Year >= ownerParameters.MinYearOfBirth && o.DateOfBirth.Year <= ownerParameters.MaxYearOfBirth); //searchByName اضافه کردن خط جدید برای فراخوانی متد SearchByName(ref owners, ownerParameters.Name); return PagedList<Owner>.ToPagedList(owners.OrderBy(on => on.Name), ownerParameters.PageNumber, ownerParameters.PageSize); } //owner اضافه کردن متد جدید برای عملکرد جست و جو با استفاده از نام private void SearchByName(ref IQueryable<Owner> owners, string ownerName) { if (!owners.Any() || string.IsNullOrWhiteSpace(ownerName)) return; owners = owners.Where(o => o.Name.ToLower().Contains(ownerName.Trim().ToLower())); } |
اول از همه، با یک بررسی ساده با استفاده از IsNullOrWhiteSpace بر روی ویژگی Name، باید بررسی کنیم که آیا پارامتر name واقعا ارسال شده است یا خیر. اگر ارسال نشده باشد، جست و جو هیچ معنایی ندارد. بعد از آن، از عبارت where به همراه رشته Name ارسال شده که با استفاده از Trim، فضاهای خالی در آن حذف میشوند، استفاده میکنیم. ما این کار را بعد از فیلترینگ انجام میدهیم تا عمل جست و جو بر روی نتایج کمتری صورت بگیرد.
بقیه کد مانند قبل میباشد.
تمام کاری که برای پیاده سازی باید انجام میدادیم همین بود. همانطور که واقعا میبینید اصلا کار سختی نبود، زیرا این، پایه ای ترین پیاده سازی از جست و جو است و ما قبلا یک زیرساخت اعمال شده را برای این کار در اختیار داشتیم.
تست پیاده سازی
تنها کاری که باقی میماند این است که solution مان را تست کنیم.
ابتدا بیایید یادآوری کنیم که جدول پایگاه داده ما شامل چه اطلاعاتی میباشد.
حالا سعی میکنیم که Anna را پیدا کنیم:
1 |
https://localhost:5001/api/owners?name=Anna Bosh |
مطمئنا، نتیجه مدنظر خود را میگیریم:
اگر نام کامل آن یعنی Anna Bosh را وارد کنیم، نتیجه یکسان خواهد بود. چون ما به صورت پیشفرض، کل عبارت را با ()Contains. جست و جو میکنیم.
به عنوان یک مثال دیگر، سعی میکنیم تمام owner هایی که شامل حرف “o” میباشند را پیدا کنیم:
1 |
https://localhost:5001/api/owner?name=o |
حالا باید به جای یک مورد، سه مورد را به عنوان نتیجه دریافت کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[ { "id": "261e1685-cf26-494c-b17c-3546e65f5620", "name": "Anna Bosh", "dateOfBirth": "1974-11-14T00:00:00", "address": "27 Colored Row" }, { "id": "24fd81f8-d58a-4bcc-9f35-dc6cd5641906", "name": "John Keen", "dateOfBirth": "1980-12-05T00:00:00", "address": "61 Wellfield Road" }, { "id": "66774006-2371-4d5b-8518-2177bcf3f73e", "name": "Nick Somion", "dateOfBirth": "1998-12-15T00:00:00", "address": "North sunny address 102" } ] |
حال آن را با فیلترینگ و صفحه بندی ترکیب میکنیم:
1 |
https://localhost:5001/api/owner?name=o&minYearOfBirth=1974&maxYearOfBith=1985&pageSize=1&pageNumber=2 |
حال میتوانید حدس بزنید که چه نتیجه ای را باید دریافت کنیم (راهنمایی: فقط یک مورد به عنوان نتیجه برگردانده میشود)؟ اگر حدس زدید، در قسمت نظرات، آن را با ما در میان بگذارید.
تمام. ما با موفقیت، عملکرد جست و جویمان را پیاده سازی و تست کردیم.
یک جمع بندی کنیم.
نتیجه گیری
در این مقاله، موضوعات زیر را پوشش داده ایم:
- جست و جو چیست و تفاوت آن با فیلترینگ چیست
- شیوه پیاده سازی جست و جو در ASP.NET Core Web API
- نحوه تست جست و جو در API مان
- ترکیب جست و جو با solution های موجود برای فیلترینگ و صفحه بندی
امیدوارم این مقاله کوتاه برای شما مفید واقع قرار گرفته باشد. اگر سوال یا نظری دارید، آن را در قسمت نظرات با ما در میان بگذارید تا در سریغترین زمان، به آن رسیدگی کنیم.
در مقاله بعدی، ما مرتب سازی (sorting) را پوشش خواهیم داد.
با سلام و خسته نباشید
ممنون از اینکه آموزشاتون رو به ترتیب میذارید. با همین منوال ادامه بدید 🙂
با تشکر از سایت خوبتون
با سلام
تشکر از بازخوردتون.
در خدمتتون هستیم
سلام
ممنون از مقاله خوبتون
رکورد Anna Bosh رو به عنوان نتیجه برمیگردونه
سلام ممنون از مطالب خوبتون لطفا مطالب و یکجا بزارید و پشت سر هم من ترتیبشونو پیدا نمیکنم
سلام و درود جناب آقای عزیزی
خوشحالیم از اینکه این مقاله برای شما مفید واقع قرار گرفته.
جهت دیدن ترتیب مقالات لطفا به منوی راهنما و زیرمنوی آموزش سریالی Asp.net Core مراجعه کنید. در این زیر منو، تمامی مقالات مربوط به Asp.net Core وجود دارد و میتوانید به ترتیب آنها را مطالعه بفرمایید.
موفق و پاینده باشید