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 برای پرس و جو از بانک های اطلاعاتی رابطه ای خواهید خواند .

GravatarShahoWwW
پنج شنبه ساعت 01:20 , 23/8/1387
ایول، مدت هاست منتظر LINQ فارسی بودم. مرسی
Gravatarمحمود مروج
جمعه ساعت 19:26 , 24/8/1387
ممنون. کوتاه و مفید بود. در ضمن بابت "جابر" هم مجدد متشکر. :-)
Gravatarمحمدرضا طاهریWwW
چهارشنبه ساعت 08:32 , 29/8/1387
حامد جان، کمی هم با #C مهربونتر باش و مثال ها تو با آن هم بنویس.شاید تبدیل برخی از این کد ها به سی شارپ یکسری نکاتی داشته باشه که خوانندگان را به مشکل بندازه و از زحمت تو به خوبی نتوانند استفاده کنند. ( می دونم که وظیفه ای در این خصوص نداری و هر که طاووس خواهد ... )
Gravatarحامد بنايی
چهارشنبه ساعت 11:47 , 29/8/1387
کاملاً حق با شماست آقای طاهری ، بايد در مثال ها ، از هر دوی زبان های متداول فعلی استفاده کنم .
Gravatarmoslem borhani
دوشنبه ساعت 05:18 , 12/12/1387
سلام اگر كه همين موضوع را در سي شارب داريد بر سرمن منت نهاديد و آن را ارسال نماييد . باتشكر
نام :   
ايميل :      اين سايت از سيستم گراواتر استفاده می کند ، اگر در گراواتر دارای کد کاربری هستيد می توانيد از آن آدرس ايميل استفاده کنيد.  
وب سايت :   
ديدگاه :   
عدد زير را وارد کنيد :
  


  پيام شما بعد از بازبينی افزوده خواهد شد.