آموزش LINQ در C# (سی شارپ) - مقدمه

09 فروردین 1398
درسنامه درس 1 از سری آموزش LINQ
LINQ-introduction

با سلام خدمت کاربران عزیز روکسو، در این سری از آموزش ها قصد داریم به آموزش LINQ در C# بپردازیم. دوستان عزیزی که با زبان C# (سی شارپ) آشنایی ندارند می توانند دوره آموزش مقدماتی تا پیشرفته زبان C# (سی شارپ) را از طریق لینک زیر به صورت رایگان دریافت کنند:

پیش نیازها

  1. مباحث کامل شی گرایی (OOP)
  2. مبانی چند ریختی (polymorphism)
  3. آشنایی کامل با دستورات اولیه (for،while، if،var و...)
  4. Lambda Expressions
  5. آشنایی با دستورات Sql
  6. آشنایی با Interface و delegate

توجه:‌ تمام مواردی که در بخش پیش نیازها ارائه شده است، در دوره آموزش مقدماتی تا پیشرفته سی شارپ (که لینک آن را در بالا قرار دادیم) به صورت رایگان موجود می باشد.

LINQ چیست؟

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 در زبان های .NET
نمای کلی از معماری LINQ

بر اساس شکل بالا، انواع مختلفی از LINQ وجود دارد که به شرح زیر می باشد:

  • LINQ to Objects
  • LINQ to Datasets
  • LINQ to SQL
  • LINQ to Entities
  • LINQ to XML

که در بخش های آینده هر مورد را بررسی خواهیم کرد.

حالا این سوال مطرح می شود چرا باید از LINQ استفاده کنیم؟ چه چیزی در LINQ باعث شده که اکثر برنامه نویسان به سراغ آن می روند؟

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

برخی از مزایای مهم LINQ

  1. در ADO.NET کار با پایگاه داده به صورت Query است که مثلا به صورت String نوشته می شود و در صورت داشتن خطا بعد از کامپایل مشخص می شود اما چون LINQ جز دستورات NET. به شمار می رود قبل از کامپایل می توان خطای آن را اصلاح کرد.
  2. به دلیل intellisense بودن تمامی دستورات (تکمیل خودکار)، می توان از غلط های املایی جلوگیری کرد (حدس دستورات توسط IDE).
  3. می توان یک کد پرس و جو را در جاهای مختلف استفاده کرد
  4. با استفاده از NET debugger. می توان آن را اصلاح کرد
  5. از تمامی دستورات مرتب سازی،دسته بندی و جست و جو به راحتی پشتیبانی می کند

مانند هر تکنولوژی، LINQ نیز دارای معایبی می باشد که به شرح زیر است:

  1. برای پرس و جو های پیچیده مقدار کد نوشته شده با LINQ کمی بیشتر از Sql است.
  2. اگر در نوشتن پرس و جو (Query) مهارت کافی نداشته باشید، کد نوشته شده ممکن است ضعیف عمل کند. (کد باید بهینه سازی شود)
  3. برای استفاده از این تکنولوژی در هر پروژه باید فایل های DLL مربوطه به پروژه اضافه شود.

خب در اینجا هم مزایا و هم معایب LINQ بررسی شد اما با توجه به این که مزایای آن بسیار بیشتر معایب آن است، یادگیری و استفاده از آن به تمامی برنامه نویسان پبشنهاد می شود.

در تمامی آموزش ها، توضیحات بر روی مثال ها انجام خواهد گرفت چون توضیحات اضافی ممکن است از بار آموزشی بکاهد.

چند متد ساده در LINQ

در ابتدا چند متد ساده را بررسی می کنیم تا با کلیات و شکل LINQ آشنا شوید. در جلسه ی آینده آموزش را با LINQ To Object شروع خواهیم کرد.

توجه کنید که تمامی این متد ها در کلاس Enumerable قرار دارند و از نوع extension هستند و قبل از آن لازم است فضای نام System.linq را به پروژه ی خود اضافه کنید.

متد Min

 int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int result = Num.Min();

متد Min کم ترین مقدار آرایه را در متغیر result قرار می دهد.

متد Max

int[] Num = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int MaximumNum = Num.Max();

با استفاده از این متد می توان مقدار Max موجود در آرایه را در MaximumNum قرار داد.

متد Sum

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 می باشد و در صورتی که اعداد داخل آرایه از نوع اعشاری باشند باید نوع داده ی مناسب برای خروجی آن در نظر گرفته شود.

متد Count 

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 خواهد بود.

متد Average

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> است.

بخش اول آموزش به پایان رسید در این بخش سعی شد مثال هایی ساده بررسی شود تا برای مخاطبین عزیز این آموزش یک آشنایی اولیه بوجود آید. در نظر داشته باشید که این مبحث بسیار ساده و شیرین بوده ولی حجم مطالب آن زیاد است پس یادگیری آن نیاز به صبر و حوصله دارد.

موفق باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش LINQ توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.