سلام به کاربران عزیز روکسو، در این آموزش قصد داریم به بحث LINQ در C# بپردازیم. دوستان عزیزی که با زبان C# (سی شارپ) آشنایی ندارند می توانند دوره آموزش مقدماتی تا پیشرفته زبان C# (سی شارپ) را از طریق لینک زیر به صورت رایگان دریافت کنند:
توجه: تمام مواردی که در بخش پیش نیازها ارائه شده است، در دوره آموزش مقدماتی تا پیشرفته سی شارپ (که لینک آن را در بالا قرار دادیم) به صورت رایگان موجود می باشد.
linq مخفف Language-Integrated Query به معنای زبان پرس و جوی یکپارچه است که در دات نت 3.5 معرفی شد و به برنامه نویس اجازه می دهد که داده ها را از هر نوع منبع داده ای بدون نیاز به دانستن یک زبان دیگر پرس و جو کند. پرس و جو، فرایند به دست آوردن داده از منبع داده است. linq پرس و جوی داده ای از منابع داده ای مختلف را بسیار راحت کرده است.
قبل از معرفی linq توسط مایکروسافت، برنامه نویسان مجموعه کدهای مختلفی برای منابع داده ای مختلف استفاده می کردند. مثلا برای پرس و جو در دیتابیس از دستورات sql و برای کار با فایل های xml از Xpath استفاده می کردند، اما با استفاده از تکنولوژی LINQ فقط لازم است با کلمات کلیدی LINQ و متدهایی که در دات نت 3.5 معرفی شد آشنایی داشته باشند، در این صورت با استفاده از یک زبان واحد می توان با تمامی منابع داده ارتباط برقرار کرد.
برای کار LINQ باید فضای نام System.linq را در برنامه خود using کنید. در این بسته کلاس ها و متدهای extension قرار دارند که با کمک آن ها می توانید با منابع داده ای مخلتلف کار کنید. لازم به ذکر است LINQ در برنامه نویسی های دانت نت دیگر نیز قابل استفاده است مثلا VB.net.
شکل زیر نوع معماری LINQ را نشان می دهد:
بر اساس شکل بالا، انواع مختلفی از LINQ وجود دارد که به شرح زیر می باشد:
که در بخش های آینده هر مورد را بررسی خواهیم کرد.
حالا این سوال مطرح می شود چرا باید از LINQ استفاده کنیم؟ چه چیزی در LINQ باعث شده که اکثر برنامه نویسان به سراغ آن می روند؟
طبق گفته مایکروسافت LINQ بسیار پایدار، امن، و قابل اعتماد است و در برنامه های بزرگ و پیچیده بسیار قدرتمند عمل کرده است، به همین دلیل اکثر برنامه نویسان به جای یادگیری چند زبان برای کار با داده های مختلف ترجیح می دهند با LINQ کار کنند.
مانند هر تکنولوژی، LINQ نیز دارای معایبی می باشد که به شرح زیر است:
خب در اینجا هم مزایا و هم معایب LINQ بررسی شد اما با توجه به این که مزایای آن بسیار بیشتر معایب آن است، یادگیری و استفاده از آن به تمامی برنامه نویسان پبشنهاد می شود.
در تمامی آموزش ها، توضیحات بر روی مثال ها انجام خواهد گرفت چون توضیحات اضافی ممکن است از بار آموزشی بکاهد.
در ابتدا چند متد ساده را بررسی می کنیم تا با کلیات و شکل LINQ آشنا شوید. در جلسه آینده آموزش را با LINQ To Object شروع خواهیم کرد.
توجه کنید که تمامی این متد ها در کلاس Enumerable قرار دارند و از نوع extension هستند و قبل از آن لازم است فضای نام System.linq را به پروژه خود اضافه کنید.
int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int result = Num.Min();
متد Min کم ترین مقدار آرایه را در متغیر result قرار می دهد.
int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int MaximumNum = Num.Max();
با استفاده از این متد می توان مقدار Max موجود در آرایه را در MaximumNum قرار داد.
using System; using System.Collections.Generic; using System.LINQ; namespace LINQtutorials { class Program { static void Main(string[] args) { int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Console.WriteLine("Calculating the sum of all the elements of the array :"); int Sum = Num.Sum(); Console.WriteLine("The Sum is {0}", Sum); Console.ReadLine(); } } }
در این مثال با استفاده از متد Sum به راحتی جمع اعداد داخل آرایه را به دست می آوریم. دقت داشته باید که در این مثال خروجی از نوع int می باشد و در صورتی که اعداد داخل آرایه از نوع اعشاری باشند باید نوع داده مناسب برای خروجی آن در نظر گرفته شود.
using System; using System.Collections.Generic; using System.LINQ; namespace LINQtutorials { class Program { static void Main(string[] args) { int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Console.WriteLine("Find the count of the elements:"); int Count = Num.Count(); Console.WriteLine("The Count is {0}", Count); Console.ReadLine(); } } }
توسط این متد می توانیم تعداد عناصر موجود در آرایه را شمارش کنیم. توجه کنید که نوع آرایه می تواند string، Boolean و... باشد اما نوع داده Count همواره int خواهد بود.
using System; using System.Collections.Generic; using System.LINQ; namespace LINQtutorials class Program { static void Main(string[] args) { int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Console.WriteLine("Find the average of the elements:"); double Average = Num.Average(); Console.WriteLine("The Average is {0}", Average); Console.ReadLine(); } } }
توسط متد Average می توان میانگین اعداد داخل آرایه را محاسبه کرد.
برای آشنایی اولیه با روش کاربرد عبارات شرطی به دو مثال زیر توجه کنید:
int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> result = Num.Where(x => x % 2 == 0); foreach (int item in result) { Console.WriteLine(item.ToString()); } Console.ReadKey();
در اینجا با استفاده از Where شرط زوج بودن عدد را پیاده سازی کردیم که در واقع در درون متد where باید شرط مورد نظر قرار گیرد. توجه کنید نوع داده result از نوع اینترفیس <int>IEnumerable است. (در جای مناسب بحث می شود)
موس را بر روی where نگه دارید تا نوع خروجی و ورودی آن نمایان شود، مشاهد کنید که ورودی آن Func بوده که یک delegate است. ورودی آن int و خروجی آن از نوع bool است. برای راحتی فعلا می توانید از var به جای IEnumerable استفاده کنید.
برای آشنایی بیشتر با کاربرد عبارات Lambda Expressions به مثال های زیر توجه کنید.
using System; using System.Collections.Generic; using System.LINQ; namespace LINQExamples { class Program { static void Main(string[] args) { List<string> countries = new List<string>(); countries.Add("iran"); countries.Add("USA"); countries.Add("UK"); countries.Add("Russia"); IEnumerable<string> result = countries.Select(x => x); foreach (var item in result) { Console.WriteLine(item); } Console.ReadLine(); } } }
در اینجا از متد Select استفاده شده، موس را بر روی آن نگه دارید تا الگوی استفاده از آن نمایان شود .در این مثال از Lambda Expressions برای گرفتن عناصر از List که از جنس string است استفاده شده بدین صورت که ورودی آن پارامتر X (سمت چپ) و با استفاده از => همان پارامتر X (سمت راست) را بدون بیان شرطی به خروجی ارسال کرده ایم که نتیجه آن کل عناصر list می باشد. توجه کنید که جنس پارامتر result از نوع IEnumerable<string> است.
بخش اول آموزش به پایان رسید در این بخش سعی شد مثال هایی ساده بررسی شود تا برای مخاطبین عزیز این آموزش یک آشنایی اولیه بوجود آید. در نظر داشته باشید که این مبحث بسیار ساده و شیرین بوده ولی حجم مطالب آن زیاد است پس یادگیری آن نیاز به صبر و حوصله دارد.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.