LINQ به Objects
اولین و ابتدایی ترین نوع LINQ ، LINQ به Objects است. با کمک آن شما قادر خواهید بود تا بر روی هر enumerable object (هر شیئ که بوسیله ی واسط کاربری IEnumerable پیاده سازی می شود) عملیات پرس و جوی پیچیده را انجام دهید.
در حالی که ایجاد اشیائ ترجمه نشده (enumerable objects) که بتوان از آن کوئری گرفت و یا آن را مرتب کرد اندیشه جدیدی در دات نت نیست اما انجام چنین کاری در نسخه های قبل از ، 3.5 معمولا نیازمند مقدار قابل توجهی کدنویسی بود. اغلب کد های نوشته شده در نهایت پیچیده است و خواندن ، درک و توسعه آن توسط توسعه دهندگان دیگر سخت و دشوار است.
روش پرس و جوی سنتی(بدون استفاده از LINQ
به منظور درک بهتر توانایی LINQ در بهبود بخشیدن پرس و جو ها ، نیاز است که شما نحوه ی پرس و جو گرفتن بدون LINQ را بدانید.
مثال های 1 تا 4 مثال هایی هستند که پرس و جو هایی را بدون استفاده از LINQ ایجاد کردند و مشکلات آن ها را بررسی خواهیم کرد.
مثال 1 یک کلاس فیلم ساده که شما میتوانید به عنوان پایه از آن استفاده کنید را نشان میدهد:
کد های VB.NET
Imports Microsoft.VisualBasic
Public Class Movie
Private _title As String
Private _director As String
Private _genre As Integer
Private _runtime As Integer
Private _releasedate As DateTime
Public Property Title() As String
Get
Return _title
End Get
Set(ByVal value As String)
_title = value
End Set
End Property
Public Property Director() As String
Get
Return _director
End Get
Set(ByVal value As String)
_director = value
End Set
End Property
Public Property Genre() As Integer
Get
Return _genre
End Get
Set(ByVal value As Integer)
_genre = value
End Set
End Property
Public Property Runtime() As Integer
Get
Return _runtime
End Get
Set(ByVal value As Integer)
_runtime = value
End Set
End Property
Public Property ReleaseDate() As DateTime
Get
Return _releasedate
End Get
Set(ByVal value As DateTime)
_releasedate = value
End Set
End Property
End Class
کد های C-Sharp
using System;
public class Movie
{
public string Title { get; set; }
public string Director { get; set; }
public int Genre { get; set; }
public int RunTime { get; set; }
public DateTime ReleaseDate { get; set; }
}
این یک کلاس ساده است که در طول این قسمت از آن استفاده می شود.
حالا که یک کلاس پایه برای کار کردن داریم بیایید نحوه ی استفاده از آن را بدون LINQ ببینیم.
مثال 2 چگونگی ایجاد یک لیست عمومی فیلم و اتصال آن به گریدویو در ASP.NET را نشان میدهد:
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Collections.Generic" %>
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim movies = GetMovies()
Me.GridView1.DataSource = movies
Me.GridView1.DataBind()
End Sub
Public Function GetMovies() As List(Of Movie)
Dim movies As Movie() = { _
New Movie With {.Title = "Shrek", .Director = "Andrew Adamson", _
.Genre = 0, .ReleaseDate = DateTime.Parse("5/16/2001"),
.Runtime = 89}, _
New Movie With {.Title = "Fletch", .Director = "Michael Ritchie", _
.Genre = 0, .ReleaseDate = DateTime.Parse("5/31/1985"),
.Runtime = 96}, _
New Movie With {.Title = "Casablanca", .Director = "Michael Curtiz", _
.Genre = 1, .ReleaseDate = DateTime.Parse("1/1/1942"),
.Runtime = 102}, _
New Movie With {.Title = "Batman", .Director = "Tim Burton", _
.Genre = 1, .ReleaseDate = DateTime.Parse("6/23/1989"),
.Runtime = 126}, _
New Movie With {.Title = "Dances with Wolves",
.Director = "Kevin Costner", _
.Genre = 1, .ReleaseDate = DateTime.Parse("11/21/1990"),
.Runtime = 180}, _
New Movie With {.Title = "Dirty Dancing", .Director = "Emile Ardolino", _
.Genre = 1, .ReleaseDate = DateTime.Parse("8/21/1987"),
.Runtime = 100}, _
New Movie With {.Title = "The Parent Trap", .Director = "Nancy Meyers", _
.Genre = 0, .ReleaseDate = DateTime.Parse("7/29/1998"),
.Runtime = 127}, _
New Movie With {.Title = "Ransom", .Director = "Ron Howard", _
.Genre = 1, .ReleaseDate = DateTime.Parse("11/8/1996"),
.Runtime = 121}, _
New Movie With {.Title = "Ocean’s Eleven", .Director = "Steven Soderbergh", _
.Genre = 1, .ReleaseDate = DateTime.Parse("12/7/2001"),
.Runtime = 116}, _
New Movie With {.Title = "Steel Magnolias", .Director = "Herbert Ross", _
.Genre = 1, .ReleaseDate = DateTime.Parse("11/15/1989"),
.Runtime = 117}, _
New Movie With {.Title = "Mystic Pizza", .Director = "Donald Petrie", _
.Genre = 1, .ReleaseDate = DateTime.Parse("10/21/1988"),
.Runtime = 104}, _
New Movie With {.Title = "Pretty Woman", .Director = "Garry Marshall", _
.Genre = 1, .ReleaseDate = DateTime.Parse("3/23/1990"),
.Runtime = 119}, _
New Movie With {.Title = "Interview with the Vampire",
.Director = "Neil Jordan", _
.Genre = 1, .ReleaseDate = DateTime.Parse("11/11/1994"),
.Runtime = 123}, _
New Movie With {.Title = "Top Gun", .Director = "Tony Scott", _
.Genre = 2, .ReleaseDate = DateTime.Parse("5/16/1986"),
.Runtime = 110}, _
New Movie With {.Title = "Mission Impossible",
.Director = "Brian De Palma", _
.Genre = 2, .ReleaseDate = DateTime.Parse("5/22/1996"),
.Runtime = 110}, _
New Movie With {.Title = "The Godfather",
.Director = "Frabarnamenevis Ford Coppola", _
.Genre = 1, .ReleaseDate = DateTime.Parse("3/24/1972"),
.Runtime = 175}, _
New Movie With {.Title = "Carlito’s Way", .Director = "Brian De Palma", _
.Genre = 1, .ReleaseDate = DateTime.Parse("11/10/1993"),
.Runtime = 144}, _
New Movie With {.Title = "Robin Hood: Prince of Thieves", _
.Director = "Kevin Reynolds", .Genre = 1, _
.ReleaseDate = DateTime.Parse("6/14/1991"), .Runtime = 143}, _
New Movie With {.Title = "The Haunted", .Director = "Robert Mandel", _
.Genre = 1, .ReleaseDate = DateTime.Parse("5/6/1991"),
.Runtime = 100}, _
New Movie With {.Title = "Old School", .Director = "Todd Phillips", _
.Genre = 0, .ReleaseDate = DateTime.Parse("2/21/2003"),
.Runtime = 91}, _
New Movie With {.Title = "Anchorman: The Legend of Ron Burgundy", _
.Director = "Adam McKay", .Genre = 0, _
.ReleaseDate = DateTime.Parse("7/9/2004"),
.Runtime = 94}, _
New Movie With {.Title = "Bruce Almighty", .Director = "Tom Shadyac", _
.Genre = 0, .ReleaseDate = DateTime.Parse("5/23/2003"),
.Runtime = 101}, _
New Movie With {.Title = "Ace Ventura: Pet Detective", _
.Director = "Tom Shadyac", .Genre = 0, _
.ReleaseDate = DateTime.Parse("2/4/1994"),
.Runtime = 86}, _
New Movie With {.Title = "Goonies", .Director = "Richard Donner", _
.Genre = 0, .ReleaseDate = DateTime.Parse("6/7/1985"),
.Runtime = 114}, _
New Movie With {.Title = "Sixteen Candles", .Director = "John Hughes", _
.Genre = 1, .ReleaseDate = DateTime.Parse("5/4/1984"),
.Runtime = 93}, _
New Movie With {.Title = "The Breakfast Club", .Director = "John Hughes", _
.Genre = 1, .ReleaseDate = DateTime.Parse("2/15/1985"),
.Runtime = 97}, _
New Movie With {.Title = "Pretty in Pink", .Director = "Howard Deutch", _
.Genre = 1, .ReleaseDate = DateTime.Parse("2/28/1986"),
.Runtime = 96}, _
New Movie With {.Title = "Weird Science", .Director = "John Hughes", _
.Genre = 0, .ReleaseDate = DateTime.Parse("8/2/1985"),
.Runtime = 94}, _
New Movie With {.Title = "Breakfast at Tiffany’s", .Director =
"Blake Edwards", _
.Genre = 1, .ReleaseDate = DateTime.Parse("10/5/1961"),
.Runtime = 115}, _
New Movie With {.Title = "The Graduate", .Director = "Mike Nichols", _
.Genre = 1, .ReleaseDate = DateTime.Parse("4/2/1968"),
.Runtime = 105}, _
New Movie With {.Title = "Dazed and Confused", .Director = "Richard
Linklater", _
.Genre = 0, .ReleaseDate = DateTime.Parse("9/24/1993"),
.Runtime = 103}, _
New Movie With {.Title = "Arthur", .Director = "Steve Gordon", _
.Genre = 1, .ReleaseDate = DateTime.Parse("9/25/1981"),
.Runtime = 97}, _
New Movie With {.Title = "Monty Python and the Holy Grail", _
.Director = "Terry Gilliam", .Genre = 0, _
.ReleaseDate = DateTime.Parse("5/10/1975"),
.Runtime = 91}, _
New Movie With {.Title = "Dirty Harry", .Director = "Don Siegel", _
.Genre = 2, .ReleaseDate = DateTime.Parse("12/23/1971"),
.Runtime = 102} _
}
Return New List(Of Movie)(movies)
End Function
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>My Favorite Movies</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
کد های C-Sharp
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
var movies = GetMovies();
this.GridView1.DataSource = movies;
this.GridView1.DataBind();
}
public List<Movie> GetMovies()
{
return new List<Movie> {
new Movie { Title="Shrek", Director="Andrew Adamson", Genre=0,
ReleaseDate=DateTime.Parse("5/16/2001"), RunTime=89 } ,
new Movie { Title="Fletch", Director="Michael Ritchie", Genre=0,
ReleaseDate=DateTime.Parse("5/31/1985"), RunTime=96 } ,
new Movie { Title="Casablanca", Director="Michael Curtiz", Genre=1,
ReleaseDate=DateTime.Parse("1/1/1942"), RunTime=102 } ,
new Movie { Title="Batman", Director="Tim Burton", Genre=1,
ReleaseDate=DateTime.Parse("6/23/1989"), RunTime=126 } ,
new Movie { Title="Dances with Wolves", Director="Kevin Costner",Genre=1,
ReleaseDate=DateTime.Parse("11/21/1990"), RunTime=180 } ,
new Movie { Title="Dirty Dancing", Director="Emile Ardolino", Genre=1,
ReleaseDate=DateTime.Parse("8/21/1987"), RunTime=100 } ,
new Movie { Title="The Parent Trap", Director="Nancy Meyers", Genre=0,
ReleaseDate=DateTime.Parse("7/29/1998"), RunTime=127 } ,
new Movie { Title="Ransom", Director="Ron Howard", Genre=1,
ReleaseDate=DateTime.Parse("11/8/1996"), RunTime=121 } ,
new Movie { Title="Ocean’s Eleven", Director="Steven
Soderbergh", Genre=1,
ReleaseDate=DateTime.Parse("12/7/2001"), RunTime=116 } ,
new Movie { Title="Steel Magnolias", Director="Herbert Ross", Genre=1,
ReleaseDate=DateTime.Parse("11/15/1989"), RunTime=117 } ,
new Movie { Title="Mystic Pizza", Director="Donald Petrie", Genre=1,
ReleaseDate=DateTime.Parse("10/21/1988"), RunTime=104 } ,
new Movie { Title="Pretty Woman", Director="Garry Marshall", Genre=1,
ReleaseDate=DateTime.Parse("3/23/1990"), RunTime=119 } ,
new Movie { Title="Interview with the Vampire",
Director="Neil Jordan", Genre=1,
ReleaseDate=DateTime.Parse("11/11/1994"), RunTime=123 } ,
new Movie { Title="Top Gun", Director="Tony Scott", Genre=2,
ReleaseDate=DateTime.Parse("5/16/1986"), RunTime=110 } ,
new Movie { Title="Mission Impossible", Director="Brian De Palma", Genre=2,
ReleaseDate=DateTime.Parse("5/22/1996"), RunTime=110 } ,
new Movie { Title="The Godfather", Director="Frabarnamenevis Ford Coppola",
Genre=1, ReleaseDate=DateTime.Parse("3/24/1972"), RunTime=175 } ,
new Movie { Title="Carlito’s Way", Director="Brian De Palma",
Genre=1, ReleaseDate=DateTime.Parse("11/10/1993"), RunTime=144 } ,
new Movie { Title="Robin Hood: Prince of Thieves",
Director="Kevin Reynolds",
Genre=1, ReleaseDate=DateTime.Parse("6/14/1991"), RunTime=143 } ,
new Movie { Title="The Haunted", Director="Robert Mandel",
Genre=1, ReleaseDate=DateTime.Parse("5/6/1991"), RunTime=100 } ,
new Movie { Title="Old School", Director="Todd Phillips",
Genre=0, ReleaseDate=DateTime.Parse("2/21/2003"), RunTime=91 } ,
new Movie { Title="Anchorman: The Legend of Ron Burgundy",
Director="Adam McKay", Genre=0,
ReleaseDate=DateTime.Parse("7/9/2004"), RunTime=94 } ,
new Movie { Title="Bruce Almighty", Director="Tom Shadyac",
Genre=0, ReleaseDate=DateTime.Parse("5/23/2003"), RunTime=101 } ,
new Movie { Title="Ace Ventura: Pet Detective", Director="Tom Shadyac",
Genre=0, ReleaseDate=DateTime.Parse("2/4/1994"), RunTime=86 } ,
new Movie { Title="Goonies", Director="Richard Donner",
Genre=0, ReleaseDate=DateTime.Parse("6/7/1985"), RunTime=114 } ,
new Movie { Title="Sixteen Candles", Director="John Hughes",
Genre=1, ReleaseDate=DateTime.Parse("5/4/1984"), RunTime=93 } ,
new Movie { Title="The Breakfast Club", Director="John Hughes",
Genre=1, ReleaseDate=DateTime.Parse("2/15/1985"), RunTime=97 } ,
new Movie { Title="Pretty in Pink", Director="Howard Deutch",
Genre=1, ReleaseDate=DateTime.Parse("2/28/1986"), RunTime=96 } ,
new Movie { Title="Weird Science", Director="John Hughes",
Genre=0, ReleaseDate=DateTime.Parse("8/2/1985"), RunTime=94 } ,
new Movie { Title="Breakfast at Tiffany’s", Director="Blake Edwards",
Genre=1, ReleaseDate=DateTime.Parse("10/5/1961"), RunTime=115 } ,
new Movie { Title="The Graduate", Director="Mike Nichols",
Genre=1, ReleaseDate=DateTime.Parse("4/2/1968"), RunTime=105 } ,
new Movie { Title="Dazed and Confused", Director="Richard Linklater",
Genre=0, ReleaseDate=DateTime.Parse("9/24/1993"), RunTime=103 } ,
new Movie { Title="Arthur", Director="Steve Gordon",
Genre=1, ReleaseDate=DateTime.Parse("9/25/1981"), RunTime=97 } ,
new Movie { Title="Monty Python and the Holy Grail",
Director="Terry Gilliam",
Genre=0, ReleaseDate=DateTime.Parse("5/10/1975"), RunTime=91 } ,
new Movie { Title="Dirty Harry", Director="Don Siegel",
Genre=2, ReleaseDate=DateTime.Parse("12/23/1971"), RunTime=102 }
};
}
</script>
این مثال ساده را در ASP.NET نوشتیم که شامل یک گریدویو برای نمایش اطلاعات عمومی فیلم است. آن را اجرا کنید و نتیجه را ببینید.
توجه داشته باشید که استفاده از کتابخانه ی زیر را فراموش نکنید.
using System.Collections.Generic;
در مثال بعدی یک فیلترینگ ساده را بدون LINQ بررسی خواهیم کرد.