جستجو در LINQ
بسم الله الرحمن الرحیم
جستجو یک لیست در عناصر لیست دیگر
روش های زیادی برای انجام یک کار وجود دارد و در بسیاری از مواقع تمامی این روش ها شما را به مقصودتان می رساندد اما طبیعتا همه ی آنها روش درست نیستند. یکی از موارد زیادی که ممکن است برای شما نیز اتفاق بیافتد جستجو کردن یک لیست از اطلاعات درون یک لیست دیگر است طبیعتا اولین راه حل نوشتن یک حلقه (f
بسم الله الرحمن الرحیم
جستجو یک لیست در عناصر لیست دیگر
روش های زیادی برای انجام یک کار وجود دارد و در بسیاری از مواقع تمامی این روش ها شما را به مقصودتان می رساندد اما طبیعتا همه ی آنها روش درست نیستند. یکی از موارد زیادی که ممکن است برای شما نیز اتفاق بیافتد جستجو کردن یک لیست از اطلاعات درون یک لیست دیگر است طبیعتا اولین راه حل نوشتن یک حلقه (for, foreach, while, ,...) و بررسی تک تک عناصر مجموعه اول در مجموعه دوم است.
در اینجا با یک کد بسیار ساده LINQ (لینک تلفظ می شود) می توانیم این بررسی را انجام دهیم.
تصور کنید یک لیست از کاربران خود را با یک شرط مشخص از پایگاه داده واکشی می کنیم. مثلا تمامی کاربرانی که فیلد enable آنها true است.
using (ContextDB contextDB = new ContextDB())
{
var listOfUserID = contextDB.Users.Where(x => x.Enabled == true).Select(x => x.UserID).ToList();
List<Student> StudentUsers = contextDB.Students.Where(x => listOfUserID.Contains(x.UserID)).ToList();
foreach (var item in StudentUsers)
{
Response.Write(item.FirstName);
}
}
در خط اول این دستور ما ابتدا لیست کاربرانی که مقدار فیلد Enabled آنها true است را انتخاب کرده ایم و سپس فقط ستون UserID را از این رکوردها واکشی کرده و در متغییر listOfUserID ذخیره کرده ایم.
در خط دوم بر روی جدولی به نام Student کوئری را اجرا کرده ایم. این کوئری دانش آموزانی که ID آنها در listOfUserID موجود است را انتخاب می کند.
در واقع اگر بخواهیم خیلی ساده این مثال را تکرار کنیم به صورت زیر خواهد بود:
int[] listOfUserID = new int[] {1,2,3,4,5};
int[] students = new int[] {1,2,3,9,10};
var result = students.Where(x => listOfUserID.Contains(x)).toList();
در مثال بالا دو لیست داریم می خواهیم در لیست students لیست listOfUserID را بررسی کنیم و در واقع Join ایجاد کنیم تا اشتراک این دو لیست را مشخص کنیم.
در نهایت در صورت اجرای دستور بالا نتیجه زیر بدست خواهد آمد
در صورتی که بخواهیم تفاضل این دولیست را مشخص کنیم می تواینم از علامت NOT و یا همان ! استفاده کنیم مانند زیر
int[] listOfUserID = new int[] {1,2,3,4,5};
int[] students = new int[] {1,2,3,9,10};
var result = students.Where(x => !listOfUserID.Contains(x)).toList();
نتیجه اجرای دستور بالا خروجی زیر خواهد بود
همانطور که در ابتدای مقاله گفتیم برای انجام یک کار روش های زیادی وجود دارد، ما نیز در این جا یکی از این روش ها را بررسی کردیم.