کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ ) در سی شارپ

خیلی نیاز به تاکید نیست که اهمیت قابلیت ” پرس و جو یا کوئری ” برای هر اپلیکشنی در هر پلتفرمی مثل اهمیت دست و پا برای بدن انسان است.

اگر فکر نکنی دارم پیاز داغش رو زیاد می کنم باید بگم روزانه به تعداد موهای سرت از قابلیت ” پرس و جو” در اپلیکیشن های مختلف استفاده می شود.

مثال های زیر را ببینیم :

دانشگاه – انتخاب واحد – روز

 

 

بیمارستان – ساعت ملاقات – روز

 

شخصیت قهرمان دو فیلم بالا کسی نیست جز قابلیت ” جست جو ” در نرم افزاری که مسئولین دانشگاه یا پرسنل بیمارستان از آن استفاده می کنند!

تو به عنوان یک برنامه نویس یا شخصی که می خواهد برنامه نویس شود باید قسمت کد ها را کارگردانی کنی!

و برنامه ای بسازی که مسئول آموزش بتواند شماره دانشجویی را وارد کند و مشکلات دانشجو را حل کند.

منظورم از پشت صحنه این است که:

با کدها چه ساز و کاری را پیاده میکنی تا با استفاده از اطلاعاتی که از کاربر گرفته می شود، بعد از چند ثانیه نتیجه به تو برگردد!

برنامه نویسی یا کد نویسی قابلیت ” پرس و جو ”  Query چگونه انجام می شود؟!

بدون حرف پیش همه آموزش ها برای شروع از حلقه foreach یا سایر حلقه ها استفاده می کنند !

بجای  foreach از تکنولوژی لینکیو ( LINQ ) استفاده می شود به چند دلیل!

۱-    خوانایی بیشتر

۲-     کوتاه تر بودن

دو دلیل کافی برای هر برنامه نویس برای بهبود برنامه هایشان !

احساس نمی کنی آشنایی با اهمیت پرس و جو  و سازوکار آن ، انگیزه کافی برای یادگیری تکنولوژی شگفت انگیز و بسیار آسان LINQ را گرفته باشیم ؟!

بنابراین به قول خارجیا Lets GO

به طور کلی foreach و if ای که به همراه هم می آیند هدفشان این است که :

۱-       با foreach دانه دانه داده های موجود در یک لیست یا جدول بانک اطلاعاتی خوانده شوند!

۲-       هر دانه از داده هایی که در مورد دو گفته شد در متغیر item مربوط به حلقه foreach قرار می گیرید

۳-       دانه ای که در item هست با هرآنچه که شرط if می گوید بررسی می شود

۴-       یک نتیجه اعلام میشود

برای اینکه با عملکرد if و foreach بهتر آشنا شوی فیلم زیر را حتما ببین :

 

در کل فیلم چه می خواهد بگوید:

یک لیست از فامیل ها داریم و به دنبال کلمه عمرانی هستیم (آنچه در if قرار دارد)، یکی یکی اعضای لیست برسی می شود تا به کلمه عمرانی برسد و پیغام True را نمایش دهد.

آنچه در فیلم دیدی را با لینکیو به صورت زیر پیاده سازی می کنیم :

var q = from i in persoles where i == ” عمرانی ” select i;

 

نتیجه این عبارت در متغیر q ذخیره می شود و ممکن است در هر جایی استفاده شود. ( در مقاله های آتی به آنها خواهیم رسید).

حالا می خواهم ببینی مرد یا زنی که در بیمارستان یا دانشگاه یا هر جای دیگری فقط یک اسم یا شماره سرچ می کند چطور به سادگی با یک خط  Linq به هدفش می رسد؟

LINQ ( لینکیو ) یک زبان برای پرس و جوی  یک مورد یا مواردی خاص در یک مجموعه هست.

یک عبارت لینکیو همیشه با کلمه from شروع می شود و  با عبارت select یا group به پایان می رسد.

i که بعد از from قرار گرفته است یک متغیر است، که هر آیتم از مجموعه درون آن قرار می گیرد و دقیقا مشابه با متغیر item در حلقه foreach است.

قسمت اول عبارت یعنی گزینش، در مجموعه مورد نظر، تک تک گزینه ها را بررسی می کند.

در قسمت دوم خروجی موردنظر نمایش داده می شود.

(اگر در این قسمت سوال داری در کامنت ها از من بپرس)

برویم سراغ مثال ها  و نمونه های بیشتر از عبارات لینکیو ( LINQ ) :

ساده ترین عبارت لینکیو به شکل زیر است:

var q = from i in نام مجموعه select i;

نکته:

به عبارت هایی که با لینکیو ( LINQ ) می نویسی کوئری می گویند.

نمایش کل عضو های یک مجموعه

مثلا اگر بخواهی تمام اعضای مجموعه زیر را ببینی :

List<string> colors = new List<string>() { “red”, “blue”, “black”  };

باید یک کوئری به شکل زیر بنویسی:

var q = from i in colors select i;

برای اینکه خروجی این کوئری را  بهتر ببینی و درک کنی از یک کنترل به نام listBox1  استفاده می کنیم.:

private void button1_Click(object sender, EventArgs e)

{

List<string> colors = new List<string>() { "red", "blue", "black" };

var q = from i in colors select i;

listBox1.DataSource = q.ToList();

}

و خروجی به شکل زیر خواهد بود:

 

 

اعمال شرط بر روی پرس و جو ها

هر گاه بخواهی شرطی در پرس و جو  اعمال کنی از کلمه کلیدی where بعد از عبارت گزینش به شکل زیر استفاده کن :

 

 

مثال : از لیست colors آیتمی را در listview نمایش بده که برابر با red باشد :

private void button1_Click(object sender, EventArgs e)

{

List<string> colors = new List<string>() { “red”, “blue”, “black” };

var q = from i in colors where i==”red” select i;

listBox1.DataSource = q.ToList();

}

 

 

یا فرض کن یک لیست عددی  مثل لیست زیر داشته باشی و از بین اعداد موجود در لیست بخواهی اعداد بزرگتر از ۱۰ را نمایش دهی.

List<int> numbers = new List<int>() { 1,12,5,8,45,15,3,7,27,9 };

 

آنگاه کوئری آن را باید به صورت زیر بنویسی:

var q = from i in numbers where i>10 select i;

که خروجی آن به شکل زیر است:

 

 

خب داستانهایی که اول این مقاله عنوان شد پرس و جوی یک شماره ملی یا نام و نام و خانوادگی بود.

اکنون به آسانی می توانی با یک کوئری با استفاده از تکنولوژی لینکیو ( LINQ ) کوئری های بنویسی که با وارد کردن شماره ملی مشخصات یک فرد را بدهد یا با استفاده از نام و نام خانوادگی این کار را انجام دهی :

فقط در این مرحله لازم است کمی پیشرفته تر فکر کنی.

بجای خواندن اطلاعات از یک لیست، اطلاعات قرار است از بانک اطلاعاتی خوانده شود:

فرض کن یک بانک اطلاعات به شکل زیر داشته باشی :

 

 

چه کوئری می توان نوشت که با جست و جوی نام ” مریم عمرانی ” خروجی به شکل زیر مشاهده کنی؟

 

مثل این می ماند که شخص مراجعه کننده به بخش پذیرش بیمارستان نام مریم عمرانی را بدهد.

و گیف بالا در واقع مانیتور مسئول پذیرش است که نام ” مریم عمرانی  ” را جست و جو می کند.

کافی است یک کوئری با شرط زیر بنویسیم :

where i.name == textBox1.Text

این عبارت به این معنا است که در جدول بانک اطلاعاتی در ستون نام بگرد و اطلاعات شخصی را به من بده که با نام وارد شده در textbox برابر باشد.

و کوئری کلی به شکل زیر خواهد بود:

ttEntities db = new ttEntities();

var q = from i in db.humen where i.name == textBox1.Text select i;

dataGridView1.DataSource = q.ToList();

 

(ttEntities در واقع مدلی از بانک اطلاعاتی و db نمونه ای از آن است)

from i in db.humen در واقع در جدول human پرس و جو می کند و شرط where i.name == textBox1.Text را بررسی می کند .

به جای نام و نام خانوادگی می توانید از شماره ملی هم استفاده کنید آنگاه کوئری به صورت زیر خواهد بود :

var q = from i in db.humen where i.Code == textBox1.Text select i;

خب تا اینجا مساله پرس و جو را با هم بررسی کردیم.

اما توانایی تکنولوژی لینکیو  ( LINQ ) خیلی بیشتر از این حرف ها است.

در ادامه مهم ترین های آنها را بررسی می کنیم.

OrderBy:

گاهی اوقات لازم است تا اعضای یک مجموعه را بر اساس یک آیتم خاص به صورت صعودی یا نزولی  مرتب کنی تکنولوژی لینکیو برای این کار از  OrderBy استفاده می کند:

var q = from i in مجموعه

orderby i.آیتم خاص

select i;

 

مثال : تصور کن بخواهی بانک زیر را بر اساس سن به صورت صعودی با نزولی مرتب کنی :

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

 

کوئری آن به صورت زیر خواهد بود.

var q = from i in db.humen orderby i.age select i;

و خروجی آن به صورت زیر:

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

 

همانطور که مشخص است افراد بر اساس سن به صورت صعودی مرتب شده اند.

OrderBy به صورت پیش فرض مرتب سازی را صعودی انجام می دهد. اما باز هم این قابلیت وجود دارد که خودتان ascending و descending بودن آن را مشخص کنید مانند شکل زیر :

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

 

بنابراین اگر بخواهیم آن ها را به صورت نزولی مرتب کنیم کوئری آن به صورت زیر خواهد بود:

var q = from i in db.humen orderby i.age descending select i;

و نتیجه به شکل زیر است:

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

 

احتمالا این سوال برایت پیش می آید که اگر بخواهی بر اساس دو مورد مرتب سازی را انجام دهی کوئری را چگونه باید بنویسی؟

جواب این سوال در مثال زیر قرار دارد :

فرض کن بخواهی اعضای بانک اطلاعاتی زیر را ابتدا  بر اساس نام و سپس بر اساس سن مرتب کنی:

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

 

یک کوئری به شکل زیر می نویسیم :

var q = from i in db.humen orderby  i.name ,i.age  select i;

که خروجی آن به صورت زیر است:

ابتدا بر اساس نام مرتب شده و سپس بر اساس سن :

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

گروه بندی :

تا به اینجا هر کوئری که نوشتیم با select به پایان می رسید. اما در گروه بندی دیگر از select خبری نیست و کوئری با Group by به پایان خواهد رسید !

اما گروه بندی برای چه کاری مناسب است؟

می توان اعضای یک مجموعه را بر اساس یک کلید گروه بندی کرد، و اتفاقی که خواهد افتاد این است که اعضایی که دارای مقدار برابر در آن کلید هستند در یک گروه قرار می گیرند!

 

مثلا در پایگاه داده زیر :

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

 

اگر در این پایگاه داده کلیدی که می خواهیم گروه بندی  را بر اساس آن انجام دهیم ” سن ” باشد، عضو های این جدول به چند گروه تقسیم می شوند؟

درست است ۳ گروه، چون دو عضو ندا کریمی و ضحی شبر دارای سن ۲۵ می باشند و دو عضو دیگر ۱۰ ساله و ۳۱ ساله اند! بنابراین ۳ گروه سنی داریم .

پس یک کوئری بر اساس سن به شکل زیر است:

var q = from i in db.humen group i by i.age ;

 

خروجی این گروه بندی به صورت زیر خواهد بود!

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

مثلا برای دوستانت در دانشگاه اتفاق افتاده و آنها بدون اینکه بدانند GroupBy این کار را انجام می دهد می توانند ببینند چند گروه سنی دارند:

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

Join

فرض کنید هر کدام از اعضای این جدول یک ماشین داشته باشند که اطلاعات مربوط به ماشین حتما باید در یک جدول دیگر قرار بگیرد.

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

خب ولی چطور متوجه بشیم کی چه ماشینی داره ؟ دیدن human_id کافی نیست.

چون شاید اسم آدمی که در جدول human دارای id یک است را فراموش کرده باشی.

بهترین راه  این است که دو جدول به هم وصل شوند، کار وصل کردن دو جدول با هم از طریق join انجام می شود.

Join دو مجموعه را به هم وصل می کند و مجموعه جدیدی می سازد که دارای اعضای هر دو مجموعه است.

مثال : چه شخصی چه ماشینی دارد ؟

کوئری به شکل زیر خواهد بود:

var q = from i in db.humen

join mycar in db.mycars

on i.id equals mycar.human_id

select new { name = i.name, mycar.car_title };

و خروجی به شکل زیر:

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

برای اینکه موضوع را بهتر درک کنی بیا قسمت های مختلف را با هم بررسی کنیم:

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

 

کوئری یا پرس و جو با استفاده از لینکیو ( LINQ )

مهم ترین قسمت های تکنولوژی لینکیو ( LINQ ) عنوان شد.

اما این تکنولوژی علاوه بر سادگی با این هدف استفاده می شود که کوئری هایی مشابه به کوئری های SQL ایجاد کند.

با این تفاوت که کوئری های لینکیو در زمان ران تایم اجرا می شود. ولی کوئری های SQL چگونه هستند ؟؟

23 پاسخ
  1. bita
    bita گفته:

    با سلام وتشکر از مطالب جالب و مفیدتون. برای من که با SQL اشنایی دارم دستورات گنگ نبود و خیلی علاقه مند شدم که درباره LINQ هم بیشتربدانم و یادبگیرم . خیلی سپاسگزارم.

    پاسخ
    • ضحی شبر
      ضحی شبر گفته:

      سلام جناب وحیدی متشکرم از دقت و ریزبینی شما
      این دستور درست هست Group by یعنی ” گروه بندی ” کردن یک عنصر بر اساس یک آیتم. orderby دستور جداگانه ای برای مرتب سازی یک عنصر به صورت صعودی یا نزولی هست

      پاسخ

تعقیب

  1. […] ها صحبت شد و برای انجام آن در زمان اجرای نرم افزار تکنولوژی LINQ معرفی […]

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *