خانه > #C, LINQ, Persian Contents > نکاتی مختصر و مفید برای معرفی LINQ

نکاتی مختصر و مفید برای معرفی LINQ

سوال ۱) انگیزه اصلی برای به وجود آمدن LINQ چه بوده است؟

۱- یکپارچگی عمیق بین زبان برنامه‌نویسی و داده‌ها

۲-پیدا کردن راه حلی برای مشکل Object Relational Mapping علاوه بر ساده‌سازی تعامل بین آبجکت‌ها و منابع داده‌ای

۳- یکی کردن و یکپارچگی دسترسی به داده‌ها

سوال ۲) انواع LINQ از لحاظ دسترسی به منابع اطلاعاتی کدامند؟

۱- کار با داده‌های حافظه (LINQ to Dataset , LINQ to Object)

۲- کار با پایگاه داده (LINQ to SQL)

۳- کار با مستندات XML

۴- کار با file system و منابع دیگر مانند Active Directory

نکته ۱ : LINQ در عمل چندین دنیای مختلف را به هم چسباند. استفاده XML با آبجکتها، آبجکتها با داده های به هم مرتبط و داده‌های به هم مرتبط با XML از جمله وظایفی است که LINQ آنها را ساده کرده است.

نکته ۲ : گرامر (syntax) و مفاهیم مربوط به LINQ در تمامی انواع استفاده آن مشترک است.

نکته ۳ : زمانی که با LINQ کار می‌کنیم در دنیایی با انواع strong کار می‌نماییم که دارای فواید زیر است :

الف – قابلیت چک شدن در زمان compile و کم شدن امکان بروز exception

ب – استفاده از خصوصیت Intellisense در محیط Visual Studio

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

نکته ۵ : مبانی LINQ شامل چند بلوک می‌شود که به آن امکان گسترش‌پذیر بودن را می‌دهد :

الف – query operator    ب – query expression    پ – expression tree

نکته ۶ : ما میتوانیم پیاده‌سازی خودمان را برای LINQ داشته باشیم که این باعث گسترش‌پذیری آن است درست مانند LINQ to NHibernate که توسط توسعه‌دهندگان NHibernate نوشته شده است.

نکته ۷ : می‌توان انواع گسترده‌ای از datasource ها را به LINQ متصل کرد مانند سیستم فایل، Active Directory ، WMI ، Windows Event Log و یا API های دیگر.

ساختار LINQ

نکته ۸ : LINQ رویکردی اعلانی (declerative) دارد یعنی به مراحل انجام کار، کاری ندارد و فقط نتیجه را می‌خواهد.

نکته ۹ : سه روش برای نوشتن کوئری‌های LINQ وجود دارد که عبارتند از :

الف – قالب Query Expression

ب – قالب Extension Method

پ – ترکیبی از دو روش قبل

لازم به ذکر است که معمولا روش اول به روش‌های دیگر ترجیح داده می‌شود.

مثال برای روش اول )

int[] nums = new int[] {0,4,2,6,3,7,9}

var result = from n in nums

where n < 5

orderby n

select n;

مثال برای روش دوم)

var result2 = nums

.Where ( n => n<5)

.OrderBy ( n => n);

مثال برای روش سوم)

var result3 = ( from n in nums

where n < 5

orderby n

select n).Distinct();

نکته ۱۰ : کامپایلر #C تمام کوئری‌ها را به Extension Method تبدیل می‌کند و آن را اجرا می‌نماید بنابراین روش اول فقط برای کاربرپسند بودن و قابل فهم‌تر بودن به #C اضافه شده است.

نکته ۱۱ : هر جایی که استفاده از Query Expression مقدوراست بهتر است که از آن روش استفاده شود. لازم به ذکر است که این روش تمامی عملگرهای استاندارد کوئری موجود را پشتیبانی نمی‌کند و در این مواقع لاجرم باید از روش دوم استفاده نماییم.

نکته ۱۲ : یکی از لغزش‌های LINQ ترتیب نوشتن عملگرها بر خلاف SQL است، یعنی به جای اینکه به ترتیب select-from-where باشد به صورت from-where-select است. البته دلیل این کار این است که این روش پشتیبانی بهتری از Intellisense در جایی که نیاز به آن است انجام می‌دهد، در ضمن در #C نوع متغیر در سمت راست آن تعریف می‌شود.

نکته ۱۳ : اگر نیازی برای استفاده از روش سوم یا به عبارتی ترکیبی از دو روش اصلی دارید، بهتر است که Extension Method ها را به انتهای عبارت انتقال دهید.

نکته ۱۴ : مایکروسافت مجموعه‌ای از Extension Method ها را تعریف کرده (به standard query operator معروف است) که این ها متدها را به هر نوعی که IEnumerable را پیاده‌سازی کرده باشد، معرفی می‌شود تا به ما اجازه دهد تا عملگرهای کوئری را بنویسیم.

نکته ۱۵ : تمامی انواع مجموعه‌ای (collection type) توکار NET. واسط IEnumerable را پیاده‌سازی کرده است بنابراین روی تمام آن‌ها می‌توان کوئری‌های موردنظر را اجرا کرد.

نکته ۱۶ : فرم کلی گرامر Extension Method ها به صورت زیر است :

[Source Collection].[Extension Method].[Extension Method]…;

به عنوان مثال :

[Source].Where([Lambda Expression]).Select([Lambda Expression]);

————————————————————————————

در ادامه بد ندیدم مطالبی را که دوست عزیز آقای علی اقدم در بخش نظرات نوشته‌اند را در پست نوشته شده بیفزایم :

یک نکته راجب نکته ۱۴ وجود دارد و اون هم اینه که عملگرهای استاندارد پرس و جو به انواعی که واسط IEnumerable و یاIQueryable را پیاده سازی کرده باشند،معرفی می شوند.

همچنین بهتر است نکات زیر به لیست اضافه شود

نکته ۱۷ : وقتی یک پرس و جو، یک مقدار واحد را برمی گرداند مثل جمع (Sum) و یا میانگین (Average) نتیجه پرس و جو در همان لحظه برگردانده می شود ولی زمانی که خروجی پرس وجو توالی از اطلاعات است،اجرای پرس و جو به عقب می افتد مثلا یک شئ IEnumerable.

نکته ۱۸ : به قابلیت چک شدن دستورات لینک در زمان کد نویسی Language-Level گفته می شود که جان توسعه دهندگان را از خطایابی خلاص می کند.

نکته ۱۹ : شاید شما فکر کنید که LINQ ابزاری است که بتوان با آن کوئری های برای آرایه و مجموعه ها ، پایگاه داده و یا XML پیاده سازی کرد ولی این تعریف درستی از LINQ نیست بلکه یک تکنولوژی است که بتوان Provider های را پیاده سازی کرد تا بوسیله آن با پایگاه داده های مختلف به یک صورت ثابت ارتباط برقرار کرد به طور مثال Provider های مانند LINQ to SQL و یا LINQ to XML که توسط تیم توسعه .NET پیاده سازی شده اند که به این مدل ، مدل Provider اطلاق می شود (LINQ provider model).برای مشاهده انواع مختلفی از این Provider ها به لینک زیر مراجعه کنید :
http://aliaghdam.blogspot.com/2010/08/linq.html

نکته ۲۰ : توجه داشته باشید که LINQ را به صورت لینک (Link) تلفط کنید چون به وفور دیده می شود که الفاظی مانند لینکیو و… تلفط میشود.

  1. سپتامبر 13, 2010 در 4:08 ب.ظ.

    سلام ،اینکه تمام نکته ها را در یک پست قرار دهیم کار جالبی است من هم چند وقته که نکته ها را سعی می کنم در یک پست معرفی کنم

    فقط یک نکته راجب نکته 14 وجود دارد و اون هم اینه که عملگرهای استاندارد پرس و جو به انواعی که واسط IEnumerable و یاIQueryable را پیاده سازی کرده باشند،معرفی می شوند.

    همچنین بهتر است نکات زیر به لیست اضافه شود

    نکته 17 :وقتی یک پرس و جو، یک مقدار واحد را برمی گرداند مثل جمع (Sum) و یا میانگین (Average) نتیجه پرس و جو در همان لحظه برگردانده می شود ولی زمانی که خروجی پرس وجو توالی از اطلاعات است،اجرای پرس و جو به عقب می افتد مثلا یک شئ IEnumerable.

    نکته 18: به قابلیت چک شدن دستورات لینک در زمان کد نویسی Language-Level گفته می شود که جان توسعه دهندگان را از خطایابی خلاص می کند.

    نکته 19: شاید شما فکر کنید که LINQ ابزاری است که بتوان با آن کوئری های برای آرایه و مجموعه ها ، پایگاه داده و یا XML پیاده سازی کرد ولی این تعریف درستی از LINQ نیست بلکه یک تکنولوژی است که بتوان Provider های را پیاده سازی کرد تا بوسیله آن با پایگاه داده های مختلف به یک صورت ثابت ارتباط برقرار کرد به طور مثال Provider های مانند LINQ to SQL و یا LINQ to XML که توسط تیم توسعه .NET پیاده سازی شده اند که به این مدل ، مدل Provider اطلاق می شود (LINQ provider model).برای مشاهده انواع مختلفی از این Provider ها به لینک زیر مراجعه کنید :
    http://aliaghdam.blogspot.com/2010/08/linq.html

    نکته 20: توجه داشته باشید که LINQ را به صورت لینک (Link) تلفط کنید چون به وفور دیده می شود که الفاظی مانند لینکیو و… تلفط میشود.

    این نکته آخر شاید یک نکته در حد این پست نباشد ولی خاطره جالبی از آن دارم،تو نمایشگاه کتاب امسال داشتم با نویسنده انتشارات ف…. ،که یه کتاب آموزش لینک نوشته بود صحبت می کردم که بنده خدا به لینک میگفت لینکیو🙂

    موفق باشید.

  2. دوست
    سپتامبر 13, 2010 در 5:34 ب.ظ.

    «لینکیو» … احتمالا شيرازي بوده🙂

  3. مصطفی
    سپتامبر 27, 2010 در 7:18 ب.ظ.

    سلام,
    در مورد نکته شماره 17 نوع IQueryable خیلی Tricky هست .تا زمانی که درون داده های اون Iterate نکردید , اون کوئری اجرا نمیشه , بعبارتی LINQاز deferred execution پشتیبانی میکند . اکیدا توصیه شده در صورتی معماری لایه ای کار میکنید , باید مواظب باشید که لایه Bussiness داده رو به صورت IQueryable به UI پاس نده . میتونید Ilist برگردونید.

  1. No trackbacks yet.

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: