با سلام خدمت کاربران عزیز روکسو، در این سری از آموزش ها قصد داریم به آموزش LINQ در C# بپردازیم. دوستان عزیزی که با زبان C# (سی شارپ) آشنایی ندارند می توانند دوره آموزش مقدماتی تا پیشرفته زبان C# (سی شارپ) را از طریق لینک زیر به صورت رایگان دریافت کنند:
پیش نیازها
- مباحث کامل شی گرایی (OOP)
- مبانی چند ریختی (polymorphism)
- آشنایی کامل با دستورات اولیه (for،while، if،var و…)
- Lambda Expressions
- آشنایی با دستورات Sql
- آشنایی با Interface و delegate
LINQ چیست؟
قبل از معرفی linq توسط ماکروسافت، برنامه نویسان مجموعه کدهای مختلفی برای منابع داده ای مختلف استفاده می کردند. مثلا برای پرس و جو در دیتابیس از دستورات sql و برای کار با فایل های xml از Xpath استفاده می کردند، اما با استفاده از تکنولوژی LINQ فقط لازم است با کلمات کلیدی LINQ و متدهایی که در دات نت 3.5 معرفی شد آشنایی داشته باشند، در این صورت با استفاده از یک زبان واحد می توان با تمامی منابع داده ارتباط برقرار کرد.
برای کار LINQ باید فضای نام System.linq را در برنامه ی خود using کنید. در این بسته کلاس ها و متدهای extension قرار دارند که با کمک آن ها می توانید با منابع داده ای مخلتلف کار کنید. لازم به ذکر است LINQ در برنامه نویسی های دانت نت دیگر نیز قابل استفاده است مثلا VB.net.
شکل زیر نوع معماری LINQ را نشان می شود .
نمای کلی از معماری LINQ
بر اساس شکل بالا، انواع مختلفی از LINQ وجود دارد که به شرح زیر می باشد:
- LINQ to Objects
- LINQ to Datasets
- LINQ to SQL
- LINQ to Entities
- LINQ to XML
که در بخش های آینده هر مورد را بررسی خواهیم کرد.
حالا این سوال مطرح می شود چرا باید از LINQ استفاده کنیم؟ چه چیزی در LINQ باعث شده که اکثر برنامه نویسان به سراغ آن می روند؟
طبق گفته ی ماکروسافت LINQ بسیار پایدار، امن، و قابل اعتماد است و در برنامه های بزرگ و پیچیده بسیار قدرتمند عمل کرده است، به همین دلیل اکثر برنامه نویسان به جای یادگیری چند زبان برای کار با داده های مختلف ترجیح می دهند با LINQ کار کنند.
برخی از مزایای مهم LINQ
- در ADO.NET کار با پایگاه داده به صورت Query است که مثلا به صورت String نوشته می شود و در صورت داشتن خطا بعد از کامپایل مشخص می شود اما چون LINQ جز دستورات NET. به شمار می رود قبل از کامپایل می توان خطای آن را اصلاح کرد.
- به دلیل intellisense بودن تمامی دستورات (تکمیل خودکار)، می توان از غلط های املایی جلوگیری کرد (حدس دستورات توسط IDE).
- می توان یک کد پرس و جو را در جاهای مختلف استفاده کرد
- با استفاده از NET debugger. می توان آن را اصلاح کرد
- از تمامی دستورات مرتب سازی،دسته بندی و جست و جو به راحتی پشتیبانی می کند
مانند هر تکنولوژی، LINQ نیز دارای معایبی می باشد که به شرح زیر است:
- برای پرس و جو های پیچیده مقدار کد نوشته شده با LINQ کمی بیشتر از Sql است.
- اگر در نوشتن پرس و جو (Query) مهارت کافی نداشته باشید، کد نوشته شده ممکن است ضعیف عمل کند. (کد باید بهینه سازی شود)
- برای استفاده از این تکنولوژی در هر پروژه باید فایل های DLL مربوطه به پروژه اضافه شود.
خب در اینجا هم مزایا و هم معایب LINQ بررسی شد اما با توجه به این که مزایای آن بسیار بیشتر معایب آن است، یادگیری و استفاده از آن به تمامی برنامه نویسان پبشنهاد می شود.
در تمامی آموزش ها، توضیحات بر روی مثال ها انجام خواهد گرفت چون توضیحات اضافی ممکن است از بار آموزشی بکاهد.
چند متد ساده در LINQ
در ابتدا چند متد ساده را بررسی می کنیم تا با کلیات و شکل LINQ آشنا شوید. در جلسه ی آینده آموزش را با LINQ To Object شروع خواهیم کرد.
توجه کنید که تمامی این متد ها در کلاس Enumerable قرار دارند و از نوع extension هستند و قبل از آن لازم است فضای نام System.linq را به پروژه ی خود اضافه کنید.
متد Min
متد Min کم ترین مقدار آرایه را در متغیر result قرار می دهد.
متد Max
با استفاده از این متد می توان مقدار Max موجود در آرایه را در MaximumNum قرار داد.
متد Sum
در این مثال با استفاده از متد Sum به راحتی جمع اعداد داخل آرایه را به دست می آوریم. دقت داشته باید که در این مثال خروجی از نوع int می باشد و در صورتی که اعداد داخل آرایه از نوع اعشاری باشند باید نوع داده ی مناسب برای خروجی آن در نظر گرفته شود.
متد Count
توسط این متد می توانیم تعداد عناصر موجود در آرایه را شمارش کنیم. توجه کنید که نوع آرایه می تواند string، Boolean و… باشد اما نوع داده ی Count همواره int خواهد بود.
متد Average
توسط متد Average می توان میانگین اعداد داخل آرایه را محاسبه کرد.
برای آشنایی اولیه با روش کاربرد عبارات شرطی به دو مثال زیر توجه کنید:
در اینجا با استفاده از Where شرط زوج بودن عدد را پیاده سازی کردیم که در واقع در درون متد where باید شرط مورد نظر قرار گیرد. توجه کنید نوع داده ی result از نوع اینترفیس <int>IEnumerable است. (در جای مناسب بحث می شود)
موس را بر روی where نگه دارید تا نوع خروجی و ورودی آن نمایان شود، مشاهد کنید که ورودی آن Func بوده که یک delegate است. ورودی آن int و خروجی آن از نوع bool است. برای راحتی فعلا می توانید از var به جای IEnumerable استفاده کنید.
برای آشنایی بیشتر با کاربرد عبارات Lambda Expressions به مثال های زیر توجه کنید.
در اینجا از متد Select استفاده شده، موس را بر روی آن نگه دارید تا الگوی استفاده از آن نمایان شود .در این مثال از Lambda Expressions برای گرفتن عناصر از List که از جنس string است استفاده شده بدین صورت که ورودی آن پارامتر X (سمت چپ) و با استفاده از => همان پارامتر X (سمت راست) را بدون بیان شرطی به خروجی ارسال کرده ایم که نتیجه ی آن کل عناصر list می باشد. توجه کنید که جنس پارامتر result از نوع IEnumerable<string> است.
بخش اول آموزش به پایان رسید در این بخش سعی شد مثال هایی ساده بررسی شود تا برای مخاطبین عزیز این آموزش یک آشنایی اولیه بوجود آید. در نظر داشته باشید که این مبحث بسیار ساده و شیرین بوده ولی حجم مطالب آن زیاد است پس یادگیری آن نیاز به صبر و حوصله دارد.
موفق باشید.
منبع: روکسو