INQ (تلفظ می شود “لینک”) مخفف Language INtegrated Query یکی از اجزای پلتفرم برنامه نویسی دات نت شرکت مایکروسافت است که قدرت کار با داده های مختلف را به زبانی شبیه زبان SQL به توسعه دهندگان می دهد. LINQ در 19 نوامبر 2007 به عنوان قسمتی از دات نت فریم ورک 3.5 عرضه شد.
منطق و دستورات لینک شبیه به زبان SQL است با این تفاوت که به تنهایی کابردی ندارد. شما باید از زبان لینک در کنار یکی از زبان های دات نت استفاده کنید تا به مقصود خود برسید در صورتی که زبان SQL یک زبان مستقل برای کار با داده هاست. اگر برنامه نویس باشید می دانید که برای دستیابی به داده های موجود در یک بانک اطلاعاتی علاوه بر استفاده از فناوری های دستیابی به داده همچون ADO باید از زبان SQL نیز استفاده کنید. مشکلی که برنامه نویسان قبل از ارائه لینک با آن مواجه بودند این بود که لایه دسترسی به داده ها از روش و منظقی متفاوت از لایه های دیگر عمل می کند. مثلاً در نظر بگیرید در یک برنامه مبتنی بر بانک اطلاعاتی برنامه نویس باید داده ها را از یک بانک اطلاعاتی با استفاده از دستورات SQL بخواند و سپس با منطق زبان برنامه نویسی آن ها را به لایه نمایش بفرستد. این عدم سازگاری لایه های نرم افزاری مشکلات زیادی به همراه می آورد. امروزه برنامه نویسان بر اساس مدل “شیء گرا” کدهای خود را می نویسند. واژه هایی همچون کلاس، شیء، متد و وراثت برای برنامه نویسان آشناست و آن ها هر روز در پروژه هایشان از آن ها استفاده می کنند. در این میان یکی از مشکلات برنامه نویسان شیء گرا، عدم شیء گرایی پایگاه های داده و داده های XML است. پروژه LINQ برای اضافه کردن قابلیت شیء گرایی به زبان SQL و در نتیجه پایگاه های داده و داده های XML بوجود آمد.

شرکت مایکروسافت برای غلبه بر مشکلات ذکر شده زبانی را طراحی نمود که در حال حاضر در دات نت فریم ورک 3.5 از آن استفاده می شود و همراه با ویژوال استادیو 2008 عرضه شده است. تمام سعی مایکروسافت بر این بوده که قواعد (Syntax) زبان لینک شبیه به زبان SQL باشد تا برنامه نویسان مجبور نباشند برای یادگیری آن وقت بگذارند. اگر برنامه نویس باشید می دانید که کوئری های زبان SQL را در یک زبان برنامه نویسی باید به صورت رشته ای (String) بنویسید و این بدین معنی است که در این صورت کوئری ها قابلیت اشکال زدایی (Debugging) نخواهند داشت. در این روش اشکال زدایی دستورات SQL بسیار مشکل خواهد بود و بعضی وقت ها واقعاً دردسر ساز خواهد شد. این را هم می دانید که دستورات SQL که به صورت رشته نوشته می شوند به همراه دیگر دستورات برنامه کامپایل نمی شوند و فقط به صورت ریسورس های رشته ای ذخیره می شوند. حالا در نظر داشته باشید که با لینک می توانید مشکلات بالا را برطرف کنید و کوئری های SQL را اشکال زدایی کنید. بدین ترتیب برنامه نویسان دات نت می توانند در هر یک از زبان های مورد حمایت دات نت همچون ویژوال بیسیک و سی شارپ از فناوری LINQ استفاده کنند و از مزایایی مثل خطایابی، IntelliSense و قدرت ویژوال استادیو استفاده کنید. به یاد داشته باشید که LINQ فقط برای داده های موجود در بانک های اطلاعاتی مورد استفاده قرار نمی گیرد بلکه صرف نظر از منبع داده ها LINQ قادر است با داده های آرایه های مختلف، کلاس ها، اشیای مختلف و فایل های XML مورد استفاده قرار گیرد.
مثلث راكس
اين روزها اكثر برنامهنويساني كه با زبانهاي شيگرايي مثل سي شارپ يا جاوا كار ميكنند، از دو ابزار مهم ديگر نيز براي ساختن برنامههاي خود استفاده ميكنند: يكي از اين ابزارها ديتابيس يا همان بانكاطلاعاتي، و ديگريXML است. البته XML موجود جديدي در بافت نرمافزارها است، ولي اكنون معلوم شده كه با حضور اينترنت در دنياي كامپيوتر، استفاده از XML تقريبا قابل چشم پوشي نيست.
مشكلي كه برنامهنويسان با آن درگيرند اين است كه هر يك از اين سه ابزار از منطق و مدل دادهاي (Data Model) متفاوتي پيروي ميكنند. مدل دادهها در بانكهاي اطلاعاتي معمولاً زبان SQL است. در حالي كه هر زبان برنامهنويسي مدل دادهاي خاصي دارد. مثلاً پلتفرم داتنت از فناوري ADO.NET استفاده ميكند. واضح است كه مدل دادهها در ADO.NET و SQL تفاوتهاي زيادي با هم دارند.
مدل دادهها در فرمت XML هم به گونه ديگري است. در XML بايد از زبان XQuery استفاده كنيد. برنامه نويس در حين كار روزمره خود مرتباً نياز دارد دادههاي خود را از يك مدل به مدل ديگر منتقل كند. مثلاً در يك برنامه مديريت فروش محصولات، گاهي برنامهنويس لازم ميداند دادههاي مشتريان را از بانك اطلاعاتي (مثلا ًSQL Server ياMySQL يا ORACLE) بخواند و سپس به فرمت XML تبديل كند تا بتواند آن را از مجراي اينترنت (مثلاً از طريق وبسرويسها) عبور دهد. در اين صورت ناگزير است همزمان دادهها را ابتدا با منطق SQL بخواند، سپس با منطق Business Tier (مثل ADO.NET) پردازش كند و سپس با منطق XQuery تبديل كند.
اريك مير از متخصصانSQL Server در شركت مايكروسافت اين سه گانگي را مثلث ROX ناميده است كه سرنام عبارات Relations in data tier ،Objects in business tier وXML in presentation tier است.
كارشناسان طراحي زبانهاي برنامهنويسي در شركت مايكروسافت مدتي است براي پيدا كردن يك راهحل براي اين مسئله، روي زبان لينك كار ميكنند. اين زبان البته يك زبان جديد برنامهنويسي در كنار سيشارپ و ويژوال بيسيك نيست، بلكه يك syntax است كه درون كدهاي برنامه به كار گرفته ميشود. (قطعه كد زیر)
اين قطعه كد به قدري گويا است كه حتي كسي كه برنامهنويس نيست نيز متوجه معني آن ميشود. تاكنون بهكارگيري چنين منطقي در زبانهاي برنامهنويسي شيگرا سابقه نداشته است. اين syntax خيلي به منطق و زبان انسان شبيه است. به همين دليل استفاده از آن باعث ساده شدن زبان برنامهنويسي ميشود.
تيم توسعه پلتفرم داتنت در مايكروسافت برهميناساس در حال طراحي و توسعه دو API براي زبان LINQ است. يكي از اينها مجموعه DLINQ است كه براي پياده سازي زبان لينك روي ADO.NET به كار ميرود. ديگري XLINQ ناميده شده كه براي امكانپذير ساختن استفاده از منطق لينك روي XML به كار ميرود.
كوشش بر اين است كه syntax برنامهنويسي در هر دو مورد مشابه زبان SQL باشد. به گونهاي كه برنامهنويسي بدون توجه به اينكه از كدام API زبان لينك استفاده ميكند، به يك شيوه بتواند با دادهها كاركند.اين APIها قرار است در چارچوب داتنت 3 (نسخه نهم زبان ويژوال بيسيك و نسخه سوم زبان سي شارپ) بهكار گرفته شوند.
يكي از اهدافي كه اين تيم از بهكارگيري منطق لينك در زبانهاي برنامه نويسي داتنت دنبال ميكند، امكانپذير ساختن اشكال زدايي از عبارات Query است.
اگر برنامهنويس باشيد، حتماً ميدانيد كه تمام قسمتهاي يك كد منهاي عبارات Query كه به صورت رشتههاي متني ميآيند، قابل اشكالزدايي يا Debugging هستند. قرارگرفتن عبارات Query به صورت مقادير متني داخل سورس كد، عملاً اشكالزدايي از آنها را دشوار ميكند. با بهكارگيري منطق زبان لينك اين مشكل به مقدار زيادي حل ميشود؛ زيرا Queryها بهجاي اينكه به صورت مقادير متني نوشته شوند، بخشي از سورس كد هستند. به همين دليل اين تكنيك Language Integrated Query نامگذاري شده است.
تيم توسعه دات نت حتي به اين موضوع فكر كرده است كه استفاده از ابزار Intellisense در ويرايشگر كد ويژوال استوديو بتواند روي زبان لينك مانور دهد. اين چيزي است كه عملاً روي API متعلق به بخشهاي DLINQ و XLINQ اتفاق ميافتد. در نتيجه برنامهنويس ميتواند كد LINQ را كامپايل نمايد و در صورت بروز خطا آن را اشكالزدايي كند.استفاده از XLINQ برنامهنويسان را از بهكارگيري منطق XQuery كه گاهي گيجكننده است، معاف ميكند؛ ضمن اينكه براي كاركردن با دادهها در ADO.NET و لايه Business Tier ميتوانيد از همان منطق و رهيافت زبان SQL در بانكاطلاعات استفاده كنيد.
عملگرهای رایج در LINQ:
در اینجا فقط لیستی تهیه شده و وارد جزیئات دستورات نشده :
۱) Select / SelectMany
2) Where
3) Sum / Min / Max / Average / Aggregate
4) Join / GroupJoin
5) Take / TakeWhile
6) Skip / SkipWhile
7) Union / Intersect / Except
8 ) GroupBy
9) OrderBy / ThenBy
چگونگی استفاده از LINQ:
کافی است در این حالت دیاگرامی مانند دیاگرام موجود در SQL رسم کرده و نام ستونها و جداول و روابط آنها را .NET 3.5 مشخص کنید. آنگاه با ذخیره کردن آنها خود .NET کلاسها را با توجه به روابط آنها از روی دیاگرام استخراج می کند. همراه آن همواره کلاسی به نام DataContext ایجاد می شود. این کلاس تمام StoredProcedure های لازمه و جداول را در بر دارد. در واقع DataContext هسته ی اصلی است و تمام عملیت مربوط به query زدن و اعمال تغییرات توسط آن صورت می گیرد.
کد زدن به وسیله LINQ :
با انجام این کارها می توان به راحتی کدهای لازم برای کار با داده را پیاده سازی کرد.
در اینجا با مثالی چگونه کد زدن با LINQ بیان می کنیم:
فرض کنید در پایگاه داده ای به نام “School” دو جدول(کلاس) به نامهای “Course” و “Student” داریم. حال می خواهیم نام تمام دانش آموزانی که درس English دارند را در جدول result نگه داریم:
SchoolDataContext db = new SchoolDataContext();
Var result = from s in db.Student
where s.Course.CourseName == “English”
select s;
یا فرض کنید بخواهید دانش آموزان متولد سال ۱۳۴۵ را حذف کنید :
SchoolDataContext db = new SchoolDataContext();
Var graduateStudent = from s in db.Student
where s.StudentBirthDate == “۱۳۴۵”
select s;
db.Student.RemoveAll(graduateStudent);
منبع: farasun.wordpress.com، ویکی پدیا، ویکی پیوتر