مروری بر LINQ در C# 2008
امروزه دیگر نمیتوان منکر کاربرد نرمافزارهای کامپیوتری در زندگی روزمره بشر گردید. همچنین در اکثر برنامههایی که امروزه بر روی کامپیوترها به کار میروند، استفاده از بانکهای اطلاعاتی انکارناپذیر است. به همین دلیل از اوایل دهه 80 میلادی تلاشهای فراوانی برای بهبود نرمافزاریهای بانک اطلاعاتی گردید و منجر به ظهور مدلهای جدید و متعددی برای ایجاد پایگاههای داده گردید. یکی از این مدلها که هم اکنون در بسیاری از نرمافزارها پیاده سازی شده است مدل RDBMS میباشد. به عنوان نمونه میتوان SQL Server و همچنین Oracle را نام برد. در حال حاضر، برای ایجاد و توسعه برنامههای مبتنی بر بانکهای اطلاعاتی، این دو نرمافزار بیشتر از مدلهای مشابه مورد استفاده قرار میگیرند.
پس از انتخاب نرمافزار ارائه دهنده خدمات بانک اطلاعاتی، نوبت به انتخاب زبان برنامه نویسی میرسد. در اینجا نیز ذکر این مورد کافیست که اگر نگاهی که گذشته داشته باشیم متوجه میشویم که در بیست سال گذشته زبانهایِ با قابلیت برنامه نویسی شئگرا به عنوان اولین و بهترین زبان برای توسعه نرمافزارها در نظر گرفته میشوند. در میان زبانهای با قابلیت برنامه نویسی شئگرا زبان #C و Java از امکانات بهتری برخوردارند.
با نگاهی به دو نرمافزار انتخاب شده در بالا متوجه به تضادی میشویم که از گذشته تا کنون گریبانگیر برنامهنویسان متعددی بوده است. با توجه به اینکه SQL Server یک بانک اطلاعاتی رابطهای است پس نمیتوان با آن به صورت شئگرا در برنامهها ارتباط برقرار کرد. البته مایکروسافت برای رفع این مشکل تا قبل از سال 2005 فعالیتهایی نظیر ارائه DataSet و ADO.NET انجام داده است. اما با این حال هنوز نمیتوان به صورت کاملاً شئگرا با این مدل از بانکهای اطلاعاتی ارتباط برقرار کرد.
در این میان شرکتهای مطرح نرمافزاری دنیا مانند Mircrosoft نیز بیکار نماندهاند و بر روی پروژههایی برای رفع مشکل یاد شده در بالا فعالیت نمودهاند. مهمترین و بهترین پروژهای که در این مورد بر روی آن کار شده است پروژه LINQ میباشد. با استفاده از این تکنولوژی دیگر نیاز به کار بردن روشهای متفاوت برای بازیابی اطلاعات از منابع دادهای گوناگون مانند بانکهای اطلاعاتی رابطهای، اسناد XML و حتی اشیاء درون حافظه نیست. در این روش از یک گرامر مشابه برای بازیابی اطلاعات از هر نوع منبع دادهای استفاده میشود؛ و البته گرامری که این روش از آن استفاده میکند به صورت شئگرا میباشد.
در ادامه نگاهی کلی بر فرم کلی این روش خواهیم انداخت و سپس به توضیح و بررسی قسمتهای مخلتف پروژه میپردازیم.
برای درک کلی گرامر این روش مثال زیر را در نظر بگیرید:
int[ ] i= {1,2,3,4,5,6,7,8,9,10,11};
var query = from p in i
where p>=5
select p;
objectdumper.write(query);
اگر کدهای بالا را کامپایل و اجرا کنید کلیه اعدادی که در آرایه i از عدد 5 بیشتر میباشند انتخاب و در متتغیر query ذخیره میشوند. این مدل استفاده از LINQ به مدل عملگری مشهور است. کامپایلر #C پس از برخورد با این عبارت آن را به فراخوانی متدهایی تبدیل میکند. پس از تبدیل، عبارت پرس و جوی بالا به صورت زیر در خواهد آمد.
var query= i.where(p=> p>5);
خروجی هر دو مدل معادل یکدیگر میباشند. متغیر p که در هر دو حالت از آن استفاده شده است برای حرکت در مجموعه مورد نظر، به کار میرود و در هر بار به یک عنصر در این مجموعه اشاره میکند.
در مورد کلاس ObjectDumper باید به عرض برسانم که این ابزار یک کلاس ساده با یک متد به نام ()Write است و از آن برای تهیه خروجی قالبدار استفاده میشود. این بدان معناست که دیگر برای چاپ اطلاعات لازم نیست با استفاده از ساختارهای تکرار در مجموعه مورد نظر حرکت کنید و با استفاده از متد ()Writeو یا ()WriteLine که در کلاس Console قرار دارند اطلاعات را چاپ کنید.
ObjectDumper هنگام نصب NET. بر روی کامپیوتر شما کپی میشود. بنابراین برای استفاده از آن کافییست فایل Objectdumper.cs را جستجو کرده و آن را به پروژه خود اضافه کنید.
اما اگر به جای استفاده از LINQ، بخواهیم با استفاده از روشهای متداول قبلی این کار را انجام دهیم باید از دستوراتی مانند زیر استفاده نمود.
int[] i= {1,2,3,4,5,6,7,8,9,10,11};
for (int j = 0; j < i.Length ; j++)
{
if (i[j]>=5)
{
Console.WriteLine(i[j]);
}
}

a day without learning is a lost day