لینک LINQ، مخفف Language-Integrated Query، از جمله راهکارهای مؤثر در دسترسی به دادهها است. امروزه، رقابت اصلی میان تولیدکنندگان ابزارهای برنامهنویسی بر سر دسترسی سریع و آسان به منابع دادهای است. لینک چارچوب مستحکمی را به وجود میآورد که دسترسی به اطلاعات ذخیرهشده روی طیف گستردهای از منابع دادهای را امکانپذیر میکند و همانند پلی برای برقراری ارتباط میان اشیا برنامهنویسی و دادهها استفاده میشود.
با این که فناوری LINQ در پائیز سال ۲۰۰۵ مطرح گردید ولی فرآیند پیاده سازی آن از سال ۲۰۰۳ آغاز شده بود . هدف از ابداع فناوری فوق، ارائه تسهیلات لازم برای پیاده کنندگان جهت کار با داده در بانک های اطلاعاتی 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 و بررسی نوع ها در زمان ترجمه نیز وجود خواهد داشت .
شکل ۱ نحوه عملکرد LINQ را نشان می دهد .
شکل ۱ : عملکرد فناوری LINQ
برای آشنایی اولیه با قابلیت های LINQ ، بد نیست بدون این که بخواهیم وارد جزئیات شویم یک مثال کاربردی را با یکدیگر دنبال نمائیم .
در این مثال با استفاده از LINQ و با یک روش مشابه به منابع داده مختلفی متصل شده و پس از بازیابی داده ، آنها را در یک ListBox جداگانه نمایش می دهیم .
منابع داده عبارتند از :
- فولدرهای موجود در یک درایو
- پردازه های در حال اجراء در ویندور
- یک بانک اطلاعاتی رابطه ای SQL
- عناصر موجود در یک آرایه
- یک فایل XML
- یک فایل متن
<%@ 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” %> <scriptrunat=”server”>
‘================================================= ===================
LINQ to SQL Class
<Table(Name:=“Persons”)> _
Public Class Person
<Column(DbType:=“Int not null”)> _
Public ID AsInteger
<Column(DbType:=“nvarchar(50) not null”)> _
Public Name AsString
<Column(DbType:=“nvarchar(50) not null”)> _
Public Email AsString
EndClass
‘================================================= ===================
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
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
‘================================================= ====================
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(OfString) = From fn In firstnames _
Where (fn.StartsWith(“س”)) _
Select fn
For Each name As String In val
ListBox4.Items.Add(name)
Next name
‘================================================= =======================
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
‘================================================= =====================
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>
‘================================================= ======================
<htmlxmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title> مثال شماره یک </title>
</head>
<body>
<form id=”form1″runat=”server”>
<div>
<asp:ListBoxID=”ListBox1″runat=”server”></asp:ListBox>
<asp:ListBoxID=”ListBox2″runat=”server”></asp:ListBox>
<asp:ListBoxID=”ListBox3″runat=”server”></asp:ListBox>
<asp:ListBoxID=”ListBox4″runat=”server”></asp:ListBox>
<asp:ListBoxID=”ListBox5″runat=”server”></asp:ListBox>
<asp:ListBoxID=”ListBox6″runat=”server”></asp:ListBox>
</div>
</form>
</body>
</html>
شکل ۲ : دستیابی به منابع داده مختلف با استفاده از فناوری LINQ
خلاصه
LINQ یک فناوری قدرتمند در زمان کار با داده است که دستاوردهای متعددی را برای پیاده کنندگان به ارمغان آورده است :
- روشی ساده جهت نوشتن query
- تسریع در پیاده سازی نرم افزار با توجه به حذف خطاهای زمان اجراء
- امکان استفاده از امکاناتی نظیر اشکال زدائی و IntelliSence در زمان پیاده سازی
- حذف خلاء موجود بین داده رابطه ای و پیاده سازی شی گراء
- استفاده از یک گرامر یکسان جهت نوشتن query صرفنظر از نوع منبع داده
- افزایش بازدهی و راندمان برنامه نویسی ، چراکه برنامه نویسان از یک رویکرد یکسان برای نوشتن query و بهنگام سازی داده از طریق زبان برنامه نویسی استفاده خواهند کرد .
LINQ از دو بخش که مکمل یکدیگر می باشند تشکیل شده است : مجموعه ای از ابزار ها جهت کار با اشیاء ، اسناد XML ، بانک های اطلاعاتی رابطه ای و سایر نوع های داده و مجموعه ای از ضمایم برای زبان های برنامه نویسی نظیر VB و #C .