LINQ چیست؟

LINQ مخفف Language Integrated Query به معنای زبان پرس و جوی یکپارچه است که در دات نت نسخه 3.5 معرفی شد و به برنامه نویس اجازه می دهد داده ها را از هر نوع منبع داده ای بدون نیاز به دانستن یک زبان دیگر پرس و جو کند. پرس و جو فرایند به دست آوردن داده از منبع داده است. LINQ پرس و جوی داده از منابع داده ای مختلف را بسیار راحت کرده است. این زبان با زبانهای C# و VB آمیخته شده است و چندین کلمه کلیدی و دستور زبان برای استفاده از آن به دو زبان مذکور اضافه شده است. قبل از ورود LINQ، برنامه نویسان مجموعه کدهای مختلفی برای منابع داده ای مختلف می نوشتند. به عنوان مثال، برای پرس و جو در یک دیتابیس SQL از دستورات SQL یا برای  فایل های XML از Xpath استفاده می کردند.  اما اکنون با استفاده از قدرت LINQ فقط لازم است با کلمات کلیدی LINQ و متدهای آن که در دات نت 3.5 معرفی شدند آشنا باشید.
linq-introduction-1001
چندین نوع LINQ به دلیل وجود provider های مختلف وجود دارد (شکل بالا). ویژوال استودیو دارای چندین provider مانند LINQ to Objects می باشد. در این قسمت تمرکز ما بر LINQ to Objects است که در پرس و جوی مجموعه ای از اشیاء در کد شما که رابط IEnumerable<T> را پیاده سازی می کنند مورد استفاده قرار می گیرد. مثال هایی از این اشیاء، آرایه ها و لیست ها یا یک مجموعه سقارشی می باشد که شما ایجاد کرده اید. LINQ to SQL هم مخصوصا طوری طراحی شده است که پرس و جوی دیتابیس های SQL Server را راحت می کند. برای پرس و جوی فایل های XML، می توان از LINQ to XML استفاده نمود. همچنین  می توان LINQ را برای پرس و جوی انواع منابع داده ای دیگر بسط داد.
تکنیک های پرس و جو به کار فته در درس های زیر می توانند در انواع مختلف LINQ مورد استفاده قرار بگیرند. شما می تونید با استفاده از متد های الحاقی که در رابط IEnumerable<T> تعریف شده اند از LINQ استفاده کنید. می توانید این متدها را مستقیما فراخوانی کنید، اما باید درباره عبارات لامبدا اطلاعاتی داشته باشید. همچنین می توان از عبارات پرس و جو که دستور زبانی شبیه به SQL دارند استفاده کرد. عبارات پرس و جو ابزار مهمی هستند. عبارت های پرس و جو ابزار اصلی برای دسترسی به داده ها با استفاده از LINQ به شمار می آیند گرچه شما می توانید از متدهای الحاقی و عبارات لامبدا هم برای پرس و جو استفاده کنید.
زبان برنامه نویسی سی شارپ جز زبان های روالمند است به این معنی که شما برای حل یک مسئله باید قدم به قدم کد های آن را بنویسید ولی LINQ جز زبان های غبر روالمند است به این معنی که شما به کامپیوتر می گویید که چه چیزی را لازم دارید(صرف نظر از الگوریتم آن) و کامپیوتر آن را برای شما فراهم می کند. قبلا از LINQ ، شما فقط باید با استفاده از زبان های روالمند در بین نتایج پرس و جو می کردید . برای مثال فرض کنید که قصد دارید لیست تمامی اعداد زوج داخل یک آرایه را بدست آورید .
برای نوشتن راه حل مسئله بالا با استفاده از زبان برنامه نویسی سی شارپ کد شما چیزی شبیه کد زیر می شود :

List<int> evenNumbers = new List<int>();
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

foreach(int num in numbers)
{
   if (num % 2 == 0)
      evenNumbers.Add(num);
}

با استفاده از کد بالا شما به کامپیوتر دستور می دهید که تک تک مقادیر داخل آرایه را بررسی کند و مقادیری که با شرط داده شده مطابقت دارند را به لیست اضافه کند. حالا مثال بالا را با استفاده از زبان LINQ به شکل زیر بازنویسی کرده ایم :

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var evenNumbers = from n in numbers
                  where n % 2 == 0
                  select n;

فعلا به دستور زبان آن توجهی نکنید ، در قسمت های بعدی مفصل در این مورد توضیح می دهیم. اولین نکته ای که در کد بالا قابل توجه است اینست که کد بالا نسبت به کد قبلی  ساده تر و قابل فهم تر است.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. ابراهیم پاسخ دادن

    سلام خسته نباشی مطالبتون خیلی عایست اگه امکان داره مطالب این بخش رو زیاد کنید

    • یونس ابراهیمی پاسخ دادن

      سلام…ممنون از لطفتون…چشم

  2. Csharp پاسخ دادن

    سلام
    ممنون از مطالب عالیتون
    اگه امکان داره این بخش LINQ رو بصورت PDF قرار بدین تا بتونیم پرینت بگیریم

  3. mohsen پاسخ دادن

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

    • یونس ابراهیمی پاسخ دادن

      سلام، ممنون
      سوال رو کپی و تو بخش پرسش و پاسخ مطرح بفرمایید
      با تشکر

  4. mohsen پاسخ دادن

    سلام خسته نباشید خدمت آقای ابراهیمی
    قسمت پرسش و پاسخ برام باز میکنه ولی وارد نمیشه میگه رمز اشتباه است ):

    • یونس ابراهیمی پاسخ دادن

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

  5. ebrahim.rayatparvar پاسخ دادن

    سلام مهندس جان
    تو SQL زمانی میخوایی جستجو کنی به دلیل اینکه Select به صورت گراف دادها رو جستجو میکنه سرعت بالاتری داره تا اینکه در #C میای تک تک دادها رو چک میکنیم. حالا میخواستم بدونم LINQ به چه صورتی کار میکنه و سرعتش نسبت به SQL و #C چطوره؟؟؟