برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

LINQ : تحولی بزرگ در کار با داده ( بخش اول )


نرم افزار یکی از ارکان مهم فناوری اطلاعات و ارتباطات در عصر حاضر است . گرچه نرم افزار در گذشته نیز همواره حائز اهمیت بوده است ، ولی در سالیان اخیر به دلیل گسترش اینترنت و ظهور نسل جدیدی از برنامه های کامپیوتری موسوم به برنامه های وب ، نگاه به نرم افزار و انتظار از آن در جهت تامین طیف گسترده ای از خواسته ها تغییر  و رشد چشمگیری یافته است . به همین دلیل است که در دنیای نرم افزار هر روز تحولات مهمی اتفاق می افتد و فناوری های جدیدی قدم در این عرصه می گذارند .
ظهور فناوری LINQ ( برگرفته شده از  Language-INtegrated Query   ) تلاشی است در این راستا که با هدف تحول در نحوه دستیابی به منابع داده ( صرفنظر از نوع منبع داده ) ، مطرح شده است .
پس از مطرح شدن هر گونه فناوری در عرصه نرم افزار ، طراحان و پیاده کنندگان با سه پرسش اساسی مواجه می گردند : این فناوری چیست ؟ چه کار می کند ؟ و چرا ما به آن نیاز داریم ؟ در این مقاله و سایر مقالاتی که در ادامه بر روی سایت منتشر خواهد شد ، سعی خواهیم کرد به سه پرسش فوق در ارتباط با فناوری LINQ پاسخ دهیم .

مقدمه

نرم افزار یکی از ارکان مهم فناوری اطلاعات و ارتباطات در عصر حاضر است . گرچه نرم افزار در گذشته نیز همواره حائز اهمیت بوده است ، ولی در سالیان اخیر به دلیل گسترش اینترنت و ظهور نسل جدیدی از برنامه های کامپیوتری موسوم به برنامه های وب ، نگاه به نرم افزار و انتظار از آن در جهت تامین طیف گسترده ای از خواسته ها تغییر  و رشد چشمگیری یافته است . به همین دلیل است که در دنیای نرم افزار هر روز تحولات مهمی اتفاق می افتد و فناوری های جدیدی قدم در این عرصه می گذارند .
ظهور فناوری LINQ ( برگرفته شده از  Language-INtegrated Query   ) تلاشی است در این راستا که با هدف تحول در نحوه دستیابی به منابع داده ( صرفنظر از نوع منبع داده ) ، مطرح شده است .
پس از مطرح شدن هر گونه فناوری در عرصه نرم افزار ، طراحان و پیاده کنندگان با سه پرسش اساسی مواجه می گردند : این فناوری چیست ؟ چه کار می کند ؟ و چرا ما به آن نیاز داریم ؟ در این مقاله و سایر مقالاتی که در ادامه بر روی سایت منتشر خواهد شد ، سعی خواهیم کرد به سه پرسش فوق در ارتباط با فناوری LINQ پاسخ دهیم .

مقدمه
کد و داده دو عنصر اساسی در نرم افزار می باشند  که هر یک دارای جایگاه تعریف شده مختص به خود است . یکی از فعالیت های مهم در زمان پیاده سازی نرم افزار ، نوشتن کد مورد نیاز جهت دستیابی به داده است . برای نوشتن کد ، پیاده کنندگان می توانند از زبان های برنامه نویسی مختلفی استفاده کنند . انتخاب زبان برنامه نویسی به عوامل متعددی نظیر نوع رفتار برنامه ، پیش زمینه و دانش پیاده کنندگان ، مهارت های تیم پیاده کننده ، نوع سیستم عامل و سیاست های سازمان بستگی دارد . صرفنظر از این که پیاده کنندگان چه زبانی را برای نوشتن کد انتخاب می نمایند ، در زمان پیاده سازی نرم افزار به دفعات مجبور خواهیم بود که با داده سرو کار داشته باشیم . داده می تواند بر روی دیسک ، جداولی در بانک اطلاعاتی و یا اسناد XML ذخیره شده باشد . در برخی موارد لازم است که با تمامی نوع های اشاره شده در یک برنامه سرو کار داشته باشیم .  فراموش نکنیم که مدیریت داده برای هر پروژه نرم افزاری یک باید است .
پیاده کنندگان نرم افزار در زمان نوشتن کد و تولید امکانات مورد نیاز در هر یک از لایه های متفاوت ( با توجه به  نوع معماری نرم افزار ) ، همواره این پرسش را با خود مطرح می نمایند که محیط پیاده سازی و یا فریمورک هائی نظیر دات نت چه امکاناتی را در اختیار آنها خصوصا" در زمان کار با داده قرار می دهند . به عبارت دیگر ، یک سیستم عامل چگونه می تواند نیاز پیاده کنندگان نرم افزار را پوشش دهد و  چه امکانات و پتانسیل هائی را در اختیار علاقه مندان به طراحی و پیاده سازی نرم افزار قرار می دهد . 
دات نت به عنوان یکی از فریمورک های پیاده سازی نرم افزار در سالیان اخیر ، امکانات متعددی را جهت کار با داده در اختیار پیاده کنندگان نرم افزار قرار می دهد . LINQ ، تلاشی است جهت یکپارچگی عمیق تر و بیش تر بین زبان های برنامه نویسی و داده .  در واقع LINQ مشتمل بر مجموعه ای از عملگرهای query استاندارد است که  معماری لازم جهت حرکت ، فیلترینگ و اجرای عملیات بر روی تقریبا" هر نوع منبع داده نظیر XML ، بانک های اطلاعاتی رابطه ای و اشیاء درون حافظه را فراهم می نماید .
قبل از هر چیز اجازه دهید ببینیم LINQ چیست ؟

LINQ چیست ؟
با این که فناوری LINQ در پائیز سال 2005 مطرح گردید ولی فرآیند پیاده سازی آن از سال 2003 آغاز شده بود . هدف از ابداع فناوری فوق، ارائه تسهیلات لازم برای پیاده کنندگان جهت کار با داده در بانک های اطلاعاتی  SQL و XML عنوان شده است. در واقع ، وجود یک حلقه گمشده بین داده رابطه ای ( بانک های اطلاعاتی )  ، اسناد XML با زبان های برنامه نویسی ، ضرورت ابداع فناوری فوق را توجیه کرده بود . پیاده کنندگان مجبور بودند  برای کار با هر یک از منابع داده ، از روش های مختلفی استفاده نمایند . LINQ  را می توان به منزله حلقه ای گمشده  بین دنیای داده و زبان های برنامه نویسی همه منظوره  تصور کرد . با استفاده از  LINQ  امکان دستیابی به داده صرفنظر از نوع داده  ، با روشی مشابه و یکسان فراهم می گردد . 
پیاده کنندگان نرم افزار در زمان نوشتن برنامه های خود معمولا" از دو زبان مختلف جهت رسیدن به یک هدف مشترک استفاده می نمایند . ما برای نوشتن کدها از یک زبان برنامه نویسی نظیر VB.NET و یا #C و برای  گفتگو با سیستم بانک اطلاعاتی از یک زبان دیگر نظیر SQL استفاده می کنیم .

برای سفارش شام خود از یک زبان و برای سفارش چای از زبان دیگر !

این موضوع می تواند چالش های متعددی را برای پیاده کنندگان نرم افزار به دنبال داشته باشد :

  • در مواردی که فریمورک دات نت را به عنوان پلت فرم انتخاب کرده باشیم ، دات نت قادر به درک کدهای SQL نخواهد بود.

  •  در مواردی که از زبان های برنامه نویسی حمایت شده در دات نت جهت نوشتن کد در محیط ویژوال استودیو استفاده می کنیم ، همواره یک ابزار قدرتمند در کنار ما است تا در صورت اشتباه در گرامر دستورات توصیه های لازم را ارائه نماید ( IntelliSense ) .از ویژگی فوق نمی توان در ارتباط با  SQL  استفاده کرد .

  • امکان بررسی نوع ها در زمان ترجمه وجود ندارد . این بدان معنی است که پیاده کنندگان تا زمانی که برنامه اجراء نگردد ، نمی توانند مشکلات احتمالی را مشاهده و قبل از زمان اجراء با آنها برخورد نمایند .

  • شرکت مایکروسافت امکانات متعددی را در فریمورک دات نت جهت کار با اسناد XML  ارائه کرده است . ارائه System.Xml ،  System.Xml.XPath و System.Xml.Schema  نمونه هائی در این زمینه می باشند . پیاده کنندگان نرم افزار در زمان کار با اسناد XML مجبور بودند که از فناوری های متعددی نظیر    DOM ( برگرفته شده از Document Object Mode ) و XQuery  استفاده نمایند . همین موضوع باعث شده بود که کار با اسناد XML نظیر خواندن و یا نوشتن داده در آنها برای بسیاری از پیاده کنندگان مشکل باشد.

شرکت مایکروسافت برای حل مشکلات فوق ، بررسی دو راهکار را در دستور کار خود قرار داد :

  • ایجاد پتانسیل های مورد نیاز  مختص XML و یا داده رابطه ای در هر یک از زبان های برنامه نویسی و زمان اجراء . راهکار فوق نه تنها مشکل اصلی را حل نمی کرد بلکه در مواردی مشکلات را خصوصا" در زمینه نگهداری افزایش می داد . 

  • اضافه کردن قابلیت های همه منظوره نوشتن query در فریمورک دات نت  . به عبارت دیگر یک فریمورک همه منظوره با قابلیت نوشتن query درون فریمورک دات نت که زبان های VB.NET و #C بتوانند به سادگی از مز ایای آن استفاده نمایند .

خوشبختانه ، شرکت مایکروسافت گزینه دوم را انتخاب نمود . ایجاد یک زیرساخت جهت نوشتن query در بین اشیاء ، اسناد XML ، داده رابطه ای و ...
هم اینک پیاده کنندگان می توانند از مزایای یک الگوی تعریفی در هر یک از زبان های دات نت جهت کار با داده  استفاده نمایند . ارائه مجموعه اپراتورهای استاندارد جهت نوشتن query یکی از دستاوردهای مهم LINQ محسوب می گردد .  بدین ترتیب ، پیاده کنندگان می توانند با بکارگیری یک مجموعه یکسان از اپراتورهای نوشتن query در هر یک از زبان های برنامه نویسی حمایت شده در دات نت ، از داده ذخیره شده در  منابع داده مختلف صرفنظر از نوع منبع داده استفاده نمایند . همچنین ، امکان استفاده از پتانسیل هائی نظیر   IntelliSense  و بررسی نوع ها در زمان ترجمه نیز وجود خواهد داشت .
شکل 1 نحوه عملکرد LINQ  را نشان می دهد .



شکل 1 : عملکرد فناوری LINQ

مثال
برای آشنایی اولیه با  قابلیت های LINQ  ، بد نیست بدون این که بخواهیم وارد جزئیات شویم یک مثال کاربردی را با یکدیگر دنبال نمائیم .
در این مثال با استفاده از LINQ و با یک روش مشابه به منابع داده مختلفی متصل شده و پس از بازیابی داده ، آنها را در یک ListBox جداگانه نمایش می دهیم . 
منابع داده عبارتند از :

  • فولدرهای موجود در یک درایو
  • پردازه های در حال اجراء در ویندور
  • یک بانک اطلاعاتی رابطه ای SQL
  • عناصر موجود در یک آرایه
  • یک فایل XML
  • یک فایل متن
<%@ Page   Language="VB" uiCulture="fa-IR" Culture="fa-IR" %>
<%
@ Import Namespace="System.Diagnostics" %>
<%
@ Import NameSpace="System.IO" %>
<%
@ Import NameSpace="System.Linq" %>
<%
@ Import NameSpace="System.Data.Linq" %>
<%
@ Import NameSpace="System.Data.Linq.Mapping" %>
<%
@ Import NameSpace="System.XML.Linq" %>
<%
@ Import NameSpace="System.Collections" %>

<script runat="server">
'====================================================================

کلاس ایجاد شده بر اساس داده موجود در بانک اطلاعاتی Contact برای جدول Persons
LINQ to SQL Class

<Table(Name:="Persons")> _
Public Class Person
   <Column(DbType:=
"Int not null")> _
   Public ID As Integer
   <Column(DbType:="nvarchar(50) not null")> _
   Public Name As String
   <Column(DbType:="nvarchar(50) not null")> _
   Public Email As String
End
Class
'==================================================================== 
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

بازیابی فولدرهای موجود در درایو C

Dim DI As DirectoryInfo = New DirectoryInfo("C:\\")
Dim dirQuery = From dir In DI.GetDirectories() Order By
               (dir.Name)
Select dir.Name
For Each item In dirQuery
    ListBox1.Items.Add(item)
Next
item
'====================================================================

بازیابی پردازه های در حال اجرا در ویندور

Dim procQuery = From proc In Process.GetProcesses() Order By proc.Id   _
             
              Descending
Select proc.Id, proc.ProcessName
For Each item In procQuery
   ListBox2.Items.Add(item.Id &
" " & item.ProcessName)
Next item
'=====================================================================

بازیابی داده موجود در جدول Persons بانک اطلاعاتی Conatct

Dim context As DataContext = New DataContext("Data Source=SRCO-1\SQLEXPRESS;
                                                                        Initial Catalog=Contact;Integrated Security=true"
)
Dim contact1 As Table(Of Person) = context.GetTable(Of Person)()
Dim query = From c In contact1 Select c.Name, c.Email
For Each item In query
     ListBox3.Items.Add(item.Name &
" " & " ==== ◄ " & item.Email)
Next item
'=======================================================================

بازیابی عناصر یک آرایه

Dim firstnames As String() = {"سخا روش", "سایت شرکت سخا روش", "سایت مقالات به زبان فارسی", "سری مقالات ", "ایران", "تهران"}  
Dim val As IEnumerable(Of String) = From fn In firstnames _
                                   
Where (fn.StartsWith("س")) _
                                   
Select fn
For Each name As String In val
     ListBox4.Items.Add(name)
Next name
'========================================================================

بازیابی داده ذخیره شده در یک فایل XML با نام Cities.xml

Dim XDoc As XDocument = XDocument.Load(MapPath("Cities.xml"))
Dim query1 = From c In XDoc.Descendants("City") _
             Order By c.Element("Name").Value _
             Select c.Element("Name").Value
For Each item In query1
    ListBox5.Items.Add(item)
Next item
'======================================================================  
 

بازیابی داده از یک فایل متن با نام Maghalat.csv

Dim query2 = From line In File.ReadAllLines(MapPath("Maghalat.csv")) _
            
Where Not line.StartsWith("#") _
            
Let parts = line.Split(",") _
            
Select Title = parts(0), Publisher = parts(1)
For Each item In query2
    ListBox6.Items.Add(item.Title &
" " & item.Publisher)
Next
item

End Sub

</script>
'=======================================================================

<html xmlns="http://www.w3.org/1999/xhtml">
<
head runat="server">
  <
title> مثال شماره یک  </title>
</
head>
<
body>
  <
form id="form1" runat="server">
    <
div>
      <
asp:ListBox ID="ListBox1" runat="server"></asp:ListBox>
      <
asp:ListBox ID="ListBox2" runat="server"></asp:ListBox>
      <
asp:ListBox ID="ListBox3" runat="server"></asp:ListBox>
      <
asp:ListBox ID="ListBox4" runat="server"></asp:ListBox>
      <
asp:ListBox ID="ListBox5" runat="server"></asp:ListBox>
      <
asp:ListBox ID="ListBox6" runat="server"></asp:ListBox>
   </
div>
  </
form>
</
body>
</
html>
 

شکل زیر خروجی برنامه فوق را نشان می دهد .

 دستیابی به منابع داده مختلف با استفاده از فناوری LINQ

شکل  2  : دستیابی به منابع داده مختلف با استفاده از فناوری LINQ

خلاصه
LINQ یک فناوری قدرتمند در زمان کار با داده است که دستاوردهای متعددی را برای پیاده کنندگان به ارمغان آورده است :

  • روشی ساده جهت نوشتن query
  • تسریع در پیاده سازی نرم افزار با توجه به حذف خطاهای زمان اجراء
  • امکان استفاده از امکاناتی نظیر اشکال زدائی و IntelliSence در زمان پیاده سازی
  • حذف خلاء موجود بین داده رابطه ای و پیاده سازی شی گراء
  • استفاده از یک گرامر یکسان جهت نوشتن query صرفنظر از نوع منبع داده
  • افزایش بازدهی و راندمان برنامه نویسی ، چراکه برنامه نویسان از یک رویکرد یکسان برای نوشتن query  و بهنگام سازی داده از طریق زبان برنامه نویسی   استفاده خواهند کرد . 

 LINQ از دو بخش که مکمل یکدیگر می باشند تشکیل شده است : مجموعه ای از ابزار ها جهت کار با اشیاء ، اسناد XML ، بانک های اطلاعاتی رابطه ای و سایر نوع های داده و مجموعه ای از ضمایم برای زبان های برنامه نویسی نظیر VB و #C  . در بخش دوم به بررسی هر یک از موارد فوق خواهیم پرداخت .

نظرات 3 + ارسال نظر
سعید یکشنبه 27 مرداد‌ماه سال 1387 ساعت 10:27 http://f10.blogsky.com

سلام عزیزم
میلاد با سعادت منجی عالم بشریت حضرت قائم عصر (عج) را به شما و خانواده محترم شما تبریک عرض می کنم
امیدوارم همیشه موفق باشید

مریم یکشنبه 3 شهریور‌ماه سال 1387 ساعت 08:33 http://marymaster.persianblog.ir/

سلام
آقا من اعتراض دارم ما با هم قبلا تبادل لینک کرده بودیم
پس حالا لینک ما کو کجا رفت
با آرزوی موفقیت شما به امید دیدار

شرمنده خانوم.بنده به کل لین سایتهایی که لینکشون کردم میل زدم که می خواهم حذفشون کنم.حالا به دست شما نرسیده نمیدونم.در هر صورت من از این بابت از شما معذرت می خواهم.
با تشکر.

مهسا چهارشنبه 10 آذر‌ماه سال 1389 ساعت 02:48

ممنون از مطلب
اما میشه رنگ وبلاگتون رو عوض کنید؟چشمم دراومد تا خوندمش(حال نداشتم تو ورد ببرمش!خب شیرازی بازی دراوردمD:)

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد