آبجی
19th February 2010, 03:06 PM
نرم افزار یکی از ارکان مهم فناوری اطلاعات و ارتباطات در عصر حاضر است . گرچه نرم افزار در گذشته نیز همواره حائز اهمیت بوده است ، ولی در سالیان اخیر به دلیل گسترش اینترنت و ظهور نسل جدیدی از برنامه های کامپیوتری موسوم به برنامه های وب ، نگاه به نرم افزار و انتظار از آن در جهت تامین طیف گسترده ای از خواسته ها تغییر و رشد چشمگیری یافته است . به همین دلیل است که در دنیای نرم افزار هر روز تحولات مهمی اتفاق می افتد و فناوری های جدیدی قدم در این عرصه می گذارند .
ظهور فناوری 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 را نشان می دهد .
http://srco.ir/Articles/images/IntroLINQ2.jpg
شکل 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:\\ (file:///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>
شکل زیر خروجی برنامه فوق را نشان می دهد .
http://njavan.com/forum/دستیابی%20به%20منابع%20داده%20م ختلف%20با%20استفاده%20از%20فناو ری%20LINQ%20
شکل 2 : دستیابی به منابع داده مختلف با استفاده از فناوری LINQ
خلاصه
LINQ یک فناوری قدرتمند در زمان کار با داده است که دستاوردهای متعددی را برای پیاده کنندگان به ارمغان آورده است :
روشی ساده جهت نوشتن query
تسریع در پیاده سازی نرم افزار با توجه به حذف خطاهای زمان اجراء
امکان استفاده از امکاناتی نظیر اشکال زدائی و IntelliSence در زمان پیاده سازی
حذف خلاء موجود بین داده رابطه ای و پیاده سازی شی گراء
استفاده از یک گرامر یکسان جهت نوشتن query صرفنظر از نوع منبع داده
افزایش بازدهی و راندمان برنامه نویسی ، چراکه برنامه نویسان از یک رویکرد یکسان برای نوشتن query و بهنگام سازی داده از طریق زبان برنامه نویسی استفاده خواهند کرد .
LINQ از دو بخش که مکمل یکدیگر می باشند تشکیل شده است : مجموعه ای از ابزار ها جهت کار با اشیاء ، اسناد XML ، بانک های اطلاعاتی رابطه ای و سایر نوع های داده و مجموعه ای از ضمایم برای زبان های برنامه نویسی نظیر VB و #C . در بخش دوم به بررسی هر یک از موارد فوق خواهیم پرداخت .
ظهور فناوری 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 را نشان می دهد .
http://srco.ir/Articles/images/IntroLINQ2.jpg
شکل 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:\\ (file:///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>
شکل زیر خروجی برنامه فوق را نشان می دهد .
http://njavan.com/forum/دستیابی%20به%20منابع%20داده%20م ختلف%20با%20استفاده%20از%20فناو ری%20LINQ%20
شکل 2 : دستیابی به منابع داده مختلف با استفاده از فناوری LINQ
خلاصه
LINQ یک فناوری قدرتمند در زمان کار با داده است که دستاوردهای متعددی را برای پیاده کنندگان به ارمغان آورده است :
روشی ساده جهت نوشتن query
تسریع در پیاده سازی نرم افزار با توجه به حذف خطاهای زمان اجراء
امکان استفاده از امکاناتی نظیر اشکال زدائی و IntelliSence در زمان پیاده سازی
حذف خلاء موجود بین داده رابطه ای و پیاده سازی شی گراء
استفاده از یک گرامر یکسان جهت نوشتن query صرفنظر از نوع منبع داده
افزایش بازدهی و راندمان برنامه نویسی ، چراکه برنامه نویسان از یک رویکرد یکسان برای نوشتن query و بهنگام سازی داده از طریق زبان برنامه نویسی استفاده خواهند کرد .
LINQ از دو بخش که مکمل یکدیگر می باشند تشکیل شده است : مجموعه ای از ابزار ها جهت کار با اشیاء ، اسناد XML ، بانک های اطلاعاتی رابطه ای و سایر نوع های داده و مجموعه ای از ضمایم برای زبان های برنامه نویسی نظیر VB و #C . در بخش دوم به بررسی هر یک از موارد فوق خواهیم پرداخت .