در این مقاله به بررسی Linq در زبان سی شارپ میپدازیم ، Linq چیست ؟ ، مزایای استفاده از LINQ و معماری آن را در C# بررسی میکنیم همراه من باشید.
در این مقاله درباره Linq یاد خواهیم گرفت و با آن آشنا می شویم.
مطالبی که در این مقاله می بینیم:
- LINQ چیست؟
- مزایای استفاده از LINQ
- معماری LINQ
- LINQ Providers
LINQ چیست؟
LINQ مخفف عبارت Language Integrated Query به معنی زبان یکپارچه کوئری است. LINQ ما را قادر میسازد تا هر نوع داده ذخیره شده ای (داکیومنت های SQL Server، اشیای داخل حافظه و…) را کوئری بزنیم.
چرا باید از LINQ استفاده کنیم؟
LINQ به ما امکان کار کردن با منابع داده مختلف را با استفاده از انواع استایل کدنویسی مشابه مانند SQL Database، XMLDocuments و اشیای داخل حافظه مانند لیست مشتریان، لیست سفارشات، لیست فروش و… را فراهم می کند. برای برنامه نویسی که برای واکشی داده ها از منابع مختلف روی اپلیکیشن های .NET کار می کند، باید تکنولوژی و نحوه نگارش همه این منابع داده متفاوت را بداند. برای واکشی داده ها از SQL باید ADO.NET و T-SQL بداند که مخصوص دیتابیس SQL است. به همین ترتیب برای داکیومنت های XML برنامه نویسان باید نحوه نوشتن XPATH و XSLT را بداند. همچنین برای واکشی داده ها از اشیای درون حافظه برنامه نویس باید کدنویسی و نحوه نگارش آرایه ها و جنریک ها را بداند.
معماری LINQ
این معماری LINQ است؛ همه ما می دانیم که می توانیم اپلیکیشن های .NET را توسعه دهیم. به طور مشابه، برنامه نویسی LINQ نیز همه زبان های برنامه نویسی .NET ای که در شکل ذکر شده برمی گرداند. بین کوئری LINQ واقعی و منبع داده اصلی جزء دیگری وجود دارد که به آن LINQ Provider می گوییم. وظیفه این LINQ Providerتبدیل این کوئری LINQبه فرمتی است که منبع داده اصلی می تواند آن را بفهمد.
فرض کنیم اپلیکیشن سعی می کند داده ها را از دیتابیس SQL واکشی کند. اگر منبع داده SQL باشد، این کوئری LINQ با LINQ to SQL provider منطبق می شود که کوئری LINQ را به T-SQL تبدیل می کند که دیتابیس اصلی می تواند آن را بفهمد. به طور مشابه، اگر کوئری LINQ باید داده هایی را از داکیومنت XML واکشی کند کوئری LINQ با آن منطبق می شود که LINQ to XML provider می باشد که کوئری LINQ به XLST تبدیل می شود که برای منبع داده XML قابل فهم است.
با یک مثال بیشتر با LINQآشنا می شویم.
در SQL Server، ما داده های زیر را داریم.
حال یک سری کد ADO.NET می نویسیم؛ برای این کار یک اپلیکیشن خالی ایجاد کرده و یک وب فرم به آن اضافه می کنیم.
یک gridview به وب فرم اضافه می کنیم.
حالا اجازه دهید connection string را به فایل web.config پروژه اضافه نماییم.
حال کدهای ADO.NET را برای فرم خود می نویسیم:
این کد ساده ADO.NET می باشد. ما connection string را از فایل web.config خوانده و با استفاده از آن شی SQL Connection را ایجاد کرده و سپس SQL command واقعی را که می خواهیم روی دیتابیس اجرا شود، ارسال می کنیم. که این یک T-SQL مختص دیتابیس SQL می باشد. به کوئری نگاه کنید، ما firstname، lastname، gender را از جدول name داریم که gender = male می باشد. توجه داشته باشید که اینجا خبری از intellisense نیست و به همین دلیل این کوئری در اینجا مستعد خطاست. ممکن است زمان نوشتن کوئری دچار خطا شویم. به جای Firstname ممکن است به اشتباه Firstname1 یا هر چیز دیگری بنویسیم. بنابراین در هنگام نوشتن intellisense مناسبی در اختیار ما نیست. سپس، ما لیستی از دانش آموزان را ارسال می کنیم، اتصال را باز کرده و لیستی از دستورات را اجرا کرده و سپس حلقه تکراری روی اشیا می زنیم. نمونه ای از شی student ساخته و سپس داده ها را از reader واکشی کرده و propertyهای مربوطه از شی student را پر می کنیم و شی student را به لیست اضافه می کنیم و اتصال را می بندیم.
بنابراین، اجازه دهید که سریعتر آن را اجرا کنیم و ببینیم که کار می کند یا خیر.
به این ترتیب، فقط دانش آموزان با جنسیت male را واکشی کرد. حالا، با توجه به اینکه اینجا intellisense نداریم اجازه دهید که چند اشتباه را به عمد مرتکب شده و اجرا بگیریم.
نام ستون را به LastName1 تغییر داده و دوباره اجرا می گیریم.
با این خطا مواجه می شویم. به این دلیل که کوئری های ADO.NET در رشته ها قرار گرفته و intellisense و بررسی خطایی وجود ندارد. با استفاده از LINQ، ما این خطاها را دریافت می کنیم، بنابراین همین مثال را با استفاده از LINQانجام می دهیم.
حال وب فرم قبل را حذف کرده و وب فرم جدیدی اضافه می نماییم.
کنترل gridview را اضافه کرده و به فایل code behind آن می رویم. حال یک کامپوننت LINQ به صورت زیر به کلاس SQL اضافه می کنیم
روی فولدر پروژه راست کلیک کرده -> Add را انتخاب -> سپس New Item -> و بعد Data را انتخاب می کنیم.
LINQ to SQL را انتخاب کرده و نام دلخواه خود مثلا Sample.dbml را روی آن می گذاریم.
جدول را کشیده و روی Sample.dbml رها می کنیم و دوباره به فایل sample.designer.cs برمی گردیم. حالا یک سری کد در قسمت code behind می نویسیم. علاوه براین، در فایل sample.designer.cs داریم:
SampleDataContext درگاهی به سوی دیتابیس به شی کلاس sampleDataContext برای بازیابی داده ها از دیتابیس می باشد.
بنابراین اولین چیزی که ما باید انجام دهیم ایجاد شی از این کلاس است.
بنابراین انچه ما می خواهیم بازیابی داده ها از دیتابیس SQL با استفاده از کوئری LINQاست بنابراین آنچه که کوئری LINQبرمی گرداند ما به عنوان منبع داده کنترل gridview استفاده می نماییم.
در اینجا از یک کلمه کلیدی استفاده کردیم و یک student متغیر ایجاد کردیم که در آن همه دانش آموزان حاضر در datacontextstudents هستند. حالا ما همه دانش آموزان را نمی خواهیم تنها آن هایی را می خواهیم که جنسیت آن ها male باشد
ابتدا برای همه دانش آموزان می بینیم:
حال، اجازه دهید که سریعتر اجرا گرفته و خروجی را ببینیم.
حال می خواهیم آن ها را فیلتر کنیم؛ ما فقط male ها را می خواهیم بنابراین شرط where را اعمال می نماییم.
همانطور که مشاهده می کنید ما در اینجا به intellisense ای که پیشتر درباره اش صحبت کردیم، دسترسی داریم.
شرط where را همانطور که فقط male را می خواستیم اعمال کردیم، حال دوباره اجرا می گیریم.
همانطور که در خروجی مشاهده می کنید فقط رکوردهای male را دریافت کردیم. حالا سعی می کنیم شرط where را تغییر دهیم. حالا ستون gender را به Gender1 تغییر داده و برنامه را build می کنیم.
همانطور که در تصویر خروجی بالا مشاهده می نمایید، خطا گرفته شد.
به این ترتیب، این کوئری LINQماست. می خواهیم که این کوئری قادر به بازیابی داده ها از دیتابیس SQL Server باشد. آیا SQL Server می تواند این کوئری LINQ را بفهمد؟ خیر
SQL Server تنها می تواند T-SQL را بفهمد بنابراین باید یک شخص واسطی در این بین باشد که این کوئری LINQ را به کوئری T-SQL که برای SQL Server قابل فهم باشد، تبدیل نماید. چه کسی می تواند باشد؟ این کار LINQ Provider است. LINQ to SQL آن را به T-SQL تبدیل کرده و به دیتابیس T-SQL ارسال می نماید.
برای اثبات آن برنامه را اجرا کرده و به پروفایلر SQL Server رفته و عبارت T-SQL را می بینیم.
پروفایلر SQL Server ما به شکل زیر است:
حال اجازه دهید که فرم را اجرا کرده و کوئری را در پروفایلر SQL Server بررسی نماییم.
حال فقط عبارت را کپی کرده و در SQL Server می چسبانیم و اجرا می گیریم و مشاهده خواهیم کرد که خروجی ها یکسان است.
تا اینجا دیدیم که کوئری LINQچگونه با دیتابیس ها کار می کند، حالا یک مثال از اشیای آرایه داخل حافظه را با هم بررسی می نماییم.
به این ترتیب آرایه ای ایجاد کردیم که می خواهیم در آن اعداد زوج را نمایش دهیم. پس خروجی ما به شکل زیر خواهد بود:
نتیجه گیری
به این ترتیب ما با منابع داده مختلف کار کردیم. یکی منبع داده T-SQL و دیگری منبع داده حافظه بود. اما کوئری LINQ برای هر دو مشابه بود. بسته به نوع منبع داده کوئری تغییر چندانی نکرد. مفهوم provider را بررسی کردیم که رابطی بود که کوئری LINQ را به نحوه نگارشی تبدیل می کرد که مختص منبع داده بود.
هیچ دیدگاهی نوشته نشده است.