نکاتی مختصر و مفید برای معرفی 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 رویکردی اعلانی (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) تلفط کنید چون به وفور دیده می شود که الفاظی مانند لینکیو و… تلفط میشود.
