عبارات پرس و جو

عبارات پرس و جو دستورات ویژه ای هستند که برای پرس و جوی یک منبع داده با استفاده از LINQ به کار می روند. LINQ مجموعه ای از متد های توسعه یافته است که آنها را صدا می زنید و نتایج دلخواه را بدست می آورید. این متد ها در فضای نامی System.Linq قرار دارند ، زمانی که شما قصد دارید از LINQ در پروژه خود استفاده کنید باید این فضای نامی را به کلاس خود اضافه کنید. در زمان اجرا عبارات پرس و جو به متد معادل خود که توسط CLR قابل فهم است تبدیل می شوند. در درس بعدی شما یاد می گیرید که چگونه با استفاده از زبان LINQ در منابع داده ای پرس و جویی را انجام دهید. با یک مثال نحوه ی پرس و جو از یک منبع داده ای را با استفاده از عبارات پرس و جو تشریح می کنیم. به این نکته توجه کنید که در مثال زیر از Linq to Objects استفاده کرده ایم ، پس برای سادگی از یک آرایه به عنوان منبع داده استفاده می کنیم.

  1: using System;
  2: using System.Linq;
  3: 
  4: namespace LinqExample
  5: {
  6:     class Program
  7:     {
  8:         static void Main(string[] args)
  9:         {
 10:             int[] numbers = { 1, 2, 3, 4, 5 };
 11: 
 12:             var result = from n in numbers 
 13:                          select n;         
 14: 
 15:             foreach (var n in result)
 16:             {
 17:                 Console.Write(n + " ");
 18:             }
 19:         }
 20:     }
 21: }
1 2 3 4 5

همانطور که قبلا گفته شد برای استفاده از زبان Linq باید فضای نام System.Linq به پروژه اضافه شود که این کار در خط دوم انجام داده ایم. در خط 10 آرایه ای از 5 عدد صحیح را مشاهده می کنید. در خط 13-12 ساده ترین عبارت پرس و جویی که می توان نوشت، قرار دارد. در درس های بعدی عبارات پرس و جوی پیشرفته تری را می نویسیم. عبارت پرس و جوی بالا تمامی اعداد داخل آرایه را به عنوان نتیجه بر می گرداند.شما با استفاده از متغیر result می توانید به آنها دسترسی داشته باشید.
ساختار کلی عبارات پرس و جو در زیر نوشته شده است :

var query = from rangeVar in dataSource
            <other operations>
            select <projection>;

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

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

هفت نوع عبارت وجود دارد که شما می توانید از آنها داخل یک عبارت پرس وجو استفاده کنید که شامل عبارات ، from ، select ، where ، orderby ، let ، join و group-by می شود. در این درس فقط از عبارات from و select استفاده می شود. عبارات پرس و جو با یک عبارت from شروع می شوند. عبارت from از یک متغیر موقت استفاده می کند که وظیفه نگهداری موقت یک مقدار از منبع داده را به عهده دارد ، بعد از آن کلمه کلیدی in و سپس نام منبع داده قرار می گیرد.

این بسیار شبیه مکانیزم حلقه foreach است که در آن هر کدام از اعضای مجموعه در یک متغیر موقت قرار می گیرند. متغیر موقت به طور خودکار، بسته به نوع اعضای منبع داده ، نوع خود را شناسایی می کند.

بعد از عبارت from شما می توانید از یک یا چند عبارت where ، orderby ، let ، join استفاده کنید. همچنین می توانید از چند عبارت from نیز استفاده کنید که در درس های بعدی به آن پرداخته می شود.

در انتهای عبارت پرس و جو ، عبارت select قرار می گیرد. بعد از کلمه کلیدی select ، نام منبع داده که نوع اعضای برگشتی را مشخص می کند قرار می گیرد. به عنوان مثال اگر مقدار بعد از عبارت select از نوع int باشد، سپس نوع پرس جو مجموعه ای از اعداد صحیح خواهد بود. به این نکته توجه کنید که یک عبارت پرس و جو می تواند با یک عبارت group-by خاتمه پیدا کند که در درس های بعدی به آن پرداخته می شود.

خلاصه آنکه یک عبارت پرس و جوی رایج با یک عبارت from همراه با یک متغیر موقت و نام منبع داده شروع می شود ، در ادامه عبارت from می توان از عبارت های where ، join ، orderby ، let و در آخر از عبارت های select و group-by استفاده می شود. اگر شما با زبان SQL آشنایی داشته باشید دستور زبان عبارات پرس و جو برای شما جالب خواهد بود، زیرا کلمه کلیدی from در اول و کلمه کلیدی select در آخر قرار می گیرند(در SQL مکان این کلمات بر عکس است). در این صورت نوع مقادیر منبع داده توسط Visual Studio تشخیص داده می شود و شما می توانید از طریق ویژگی Intellisene آن نوع را مشاهده کنید.

کلمات کلیدی که در یک عبارت پرس و جو به کار برده می شود(مانند from و select) نمونه ای ازcontextual keywords ها یا کلمات کلیدی وابسته هستند . این نوع از کلمات فقط در مکان ها و شرایط خاصی به عنوان کلمه کلیدی رفتار می کنند مثلا در یک عبارت پرس و جو. به عنوان مثال شما می توانید بدون هیچ مشکلی از کلمه select به عنوان نام یک متغیر استفاده کنید در صورتی که از آن متغیر در یک عبارت پرس و جو استفاده نکنید.

نتیجه یک پرس و جو از نوع IEnumerable است.

اگر به مثالی که قبلا توضیح داده شد نگاهی بیندازید می بینید که نتیجه در یک متغیر از نوع var قرار گرفته است، به این معنی که این متغیر برای تشخیص نوع داده های بازگشتی، از ویژگی Type Inference استفاده می کند. همچنین شما می توانید نوع داده های برگشتی را به طور صریح مشخص کنید ، به شکل زیر :

IEnumerable<int> result = from n in numbers
                          select n;

در این حالت شما باید نوع داده های برگشتی را از قبل بدانید . توصیه می شود از کلمه کلیدی var به جای این حالت استفاده کنید تا از برتری های زیاد آن بهره مند شوید. خط 18-15 از مثال قبل مقادیری که توسط پرس و جو برگشت داده شده است را نمایش می دهد. برای نمایش مقادیر از یک حلقه ساده foreach استفاده کرده ایم. البته یه این نکته توجه داشته باشید که نوع متغیر موقت در مثال قبل var است . در این حالت Compiler نوع عناصر برگشتی را به طور خودکار تشخیص می دهد.
در LINQ ویژگی به نام deferred execution (اجرای با تعویق) وجود دارد.
به این معنی که عبارات پرس و جو و متدهای LINQ تنها زمانی اجرا می شوند که برنامه شروع به خواندن از منبع داده کند یا اینکه بخواهد به یک عنصر از نتیجه پرس وجو دسترسی پیدا کند. در واقع هر عبارت پرس و جو نتیجه یک محاسبه را بر می گرداند. نتیجه عبارات تنها یک بار فراخوانی می شود و آن زمانی است که کاربر آن را درخواست کند. به عنوان مثال ، پرس و جو زمانی اجرا می شود که شما بخواهید با استفاده از یک حلقه foreach به نتایج پرس و جو دسترسی داشته باشید.
در درس های آینده  در رابطه با ویژگی deferred execution توضیحات بیشتری داده خواهد شد. ما با موفقیت اولین عبارت پرس و جوی خود را نوشتیم ، اما همانطور که می بینید این عبارت فقط داده های داخل منبع داده را بر می گرداند و کار خاص دیگری را روی آنها انجام نمی دهد.
در درس های آتی تکنیک های مختلف دیگر از جمله filtering ، ordering ، joining و grouping نتایج را یاد می گیرید.

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

  1. یاسر میرآقایی پاسخ دادن

    با سلام و خسته نباشید
    وب سایت بسیار خوبی دارید
    فقط اگر امکان داره فاصله بین خطوط رو زیاد کنید ، چون خوندن مطالب خیلی سخته
    با تشکر
    موفق باشید

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

    چشم دوست عزیز..ممنون از اینکه نظر دادین

    • محمد رضا پاسخ دادن

      با سلام خدمت شما استاد گرامی.
      امکان داره یک فایل پی دی اف از آموزش گام به گام سی شارپ بصورت گام به گام تصویری در سایت برای دانلود قرار بدید و اگر این پی دی اف بصورت پروژه محور باشه بسیار عالی میشه.

  3. پارسا پاسخ دادن

    مطالب عالی بود.
    خیلی ممنون

  4. admin پاسخ دادن

    به خدا عالیه، همین طور ادامه بدید