LINQ یا Language Integrated Query (که همانند Link خوانده می شود ) کامپوننتی است که از نسخه 3.5 دات نت به شکل پیش فرض نصب می شود و امکان انجام پرس و جو به سبک SQL را روی انواع مدلهای داده ها فراهم می کند .
LINQ عملگرهایی را تعریف می کند که انجام اعمال فیلترکردن ، پرس و جو و پروجکشن را روی آرایه ها ، کلاسها ، XML ، بانک اطلاعاتی رابطه ای و دیگر انواع اطلاعات که قابل تعریف است را آسان می کند .
عملگرهایی که بیشترین استفاده را در LINQ دارند عبارتند از :
From و In : برای واکشی مجموعه ای از اطلاعات از یک مجموعه بزرگتر به کار می رود . این عملگر به عنوان یکی از عملگرهای اصلی در LINQ استفاده می شود .
WHERE : برای اعمال محدودیت روی مجموعه ای است که از مجموعه اصلی بدست می آید .
Select : برای انتخاب یک دنباله از مجموعه اصلی استفاده می شود .
Order by : برای مرتب سازی مجموعه جواب بکار می رود .
Group By: برای ساخت زیر مجموعه ای که بر مبنای یک مقدار آن گروه بندی شده باشد استفاده می شود .
Count/Sum/Min/Max و Average برای کارهایی با مفهومی که از نامشان برداشت می شود استفاده می شوند .
Take : برای بازگرداندن n عضو اول از مجموعه به کار می رود .
Skip : برای عبور و در نظر نگرفتن n عضو اول از مجموعه به کار می رود .
Contains : در شرط ها به منظور تاکید بر وجود یک متن در یک فیلد به کار می رود مانند Like در SQL .
دستور کلی استفاده از LINQ عبارتست از :
Dim result = From item in Container Where Boolean Expression Select Item
برای آزمایش LINQ یک پروژه Windows Form ایجاد کنید . روی فرم یک جعبه متن با نام txtResult قرار داده ، خاصیت MultiLine و Scrollbar آن را به شکلی تغییر دهید که بتواند چند سطر را نمایش دهد .
می خواهیم یک دفترچه تلفن داشته باشیم . یک کلاس با نام Contact ایجاد می کنیم .
Public
Class Contact
Private _Name As String
Private _Sex As SexData
Private _Tel As String
Private _Address As String
Private _Email As String
Public Enum SexData
Male = 1
Female = 2
End Enum
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Public Property Sex() As SexData
Get
Return _Sex
End Get
Set(ByVal value As SexData)
_Sex = value
End Set
End Property
Public Property Tel() As String
Get
Return _Tel
End Get
Set(ByVal value As String)
_Tel = value
End Set
End Property
Public Property Address() As String
Get
Return _Address
End Get
Set(ByVal value As String)
_Address = value
End Set
End Property
Public Property Email() As String
Get
Return _Email
End Get
Set(ByVal value As String)
_Email = value
End Set
End Property
End
Class
این کلاس دارای فیلدهایی شامل نام ، تلفن ، آدرس پست الکترونیکی و جنسیت است . از یک متغیر با سطح دید عمومی بین اعضای فرم ، با نام Contacts برای ذخیره نام های مختلف استفاده می کنیم .
Private
Contacts As New List(Of Contact)
سپس از متدی با نام InitializeObjects برای پر کردن Contacts استفاده می کنیم .
Private
Sub InitializeObjects()
Dim HamedBanaei As New Contact With {.Address = "tehran 1", .Email = "h@b.com", .Name = "hamed banaei", .Tel = "123123", .Sex = Contact.SexData.Male}
Contacts.Add(HamedBanaei)
Dim KeyvanNayyeri As New Contact With {.Address = "tehran 2", .Email = "k@n.com", .Name = "keyvan nayyeri", .Tel = "412232", .Sex = Contact.SexData.Male}
Contacts.Add(KeyvanNayyeri)
Dim AmirEhsani As New Contact With {.Address = "tehran 3", .Email = "a@e.com", .Name = "Amir Ehsani", .Tel = "6234121323", .Sex = Contact.SexData.Male}
Contacts.Add(AmirEhsani)
Dim MohammadForutan As New Contact With {.Address = "earth", .Email = "m@f.com", .Name = "Mohammad Forutan", .Tel = "865232323", .Sex = Contact.SexData.Male}
Contacts.Add(MohammadForutan)
End Sub
این تابع را در رویداد load از فرم اصلی صدا می زنیم .
حال یک button با نام btnQuery روی فرم قرار دهید و در رویداد click آن این کد را بنویسید .
Dim Result = (From cs In Contacts Select cs)
For Each c As Contact In Result
txtResult.Text &= c.Name &
" " & c.Sex.ToString & " " & c.Tel & ControlChars.NewLine
Next
کد From cs in Contacts Select Cs ، معادل Select * در SQL تمامی آبجکت هایی که در Contacts قرار دارد را بر می گرداند . در ادامه ، در حلقه For Each تمامی آبجکت های موجود در Result را می خوانیم .
در این روش خواندن اطلاعات از Result ، اگر اطلاعات جدیدی به Contact افزوده شود در مقدار Result نیز تغییر ایجاد می شود . مثلا ً کد زیر را در نظر بگیرید :
Dim Result = (From cs In Contacts Select cs)
For Each c As Contact In Result
txtResult.Text &= c.Name &
" " & c.Sex.ToString & " " & c.Tel & ControlChars.NewLine
Next
Dim salam As New Contact With {.Address = "123", .Email = "123", .Name = "123", .Sex = Contact.SexData.Female, .Tel = "123"}
Contacts.Add(salam)
For Each c As Contact In Result
txtResult.Text &= c.Name &
" " & c.Sex.ToString & " " & c.Tel & ControlChars.NewLine
Next
قبل از اولین حلقه مقدار Result از Contacts گرفته شده است ، بعد از حلقه اول نیز یک آبجکت جدید به Contacts اضافه شده ، وقتی حلقه دوم اجرا می شود رکورد جدید نیز در خروجی آورده می شود .
همیشه استفاده ازSelect با * مفید نیست ! زیرا خواندن کل اطلاعات احتیاجی به LINQ ندارد ! می توان یک فیلد مشخصی از کلاس را بازگرداند .
Dim result = From cs In Contacts Select cs.Name, cs.Email
For Each c As Object In result
txtResult.Text &= c.name &
" " & c.email & ControlChars.NewLine
Next
یا از مرتب سازی استفاده کرد
Dim
result = From cs In Contacts Order By cs.Name Descending Select cs.Name, cs.Email
فقط دومین رکورد را بخواند
Dim
result = (From cs In Contacts Order By cs.Name Descending Select cs.Name, cs.Email).Skip(1).Take(1)
نمایش آبجکت هایی که در نام آنها a و در آدرس ایمیل آنها b باشد
Dim result = From cs In Contacts Where cs.Name.Contains("a") And cs.Email.Contains("b") _
Order By cs.Name Descending Select cs.Name, cs.Email
نمایش آنهایی که در اسمشان a هست ولی h نیست .
Dim result = (From cs In Contacts Where cs.Name.Contains("a") _
Order By cs.Name Descending Select cs.Name, cs.Email).Except(From cs2 In Contacts _
Where cs2.Name.Contains("h") _
Select cs2.Name, cs2.Email)
البته برای مورد بالا احتیاجی به except نبود و با and not cs.name.contains("h") قابل حل است .
برای استفاده از count به شکل زیر عمل می کنیم
Dim
result = (From cs In Contacts Select cs).Count
به علت اینکه Count یک مقدار عددی و صحیح است ، result نیز تبدیل به یک Integer می شود . عملگرهای min و max و sum و average هم به این شکل استفاده می شوند .
در مطلب آینده درباره استفاده از LINQ برای پرس و جو از بانک های اطلاعاتی رابطه ای خواهید خواند .