IEnumerable<T>
mewakili hanya kursor maju dari T
. .NET 3.5 menambahkan metode ekstensi yang mencakup LINQ standard query operators
suka Where
dan First
, dengan operator apa pun yang membutuhkan predikat atau fungsi anonim Func<T>
.
IQueryable<T>
mengimplementasikan operator kueri standar LINQ yang sama, tetapi menerima Expression<Func<T>>
predikat dan fungsi anonim. Expression<T>
adalah pohon ekspresi terkompilasi, versi rusak dari metode ("setengah dikompilasi" jika Anda mau) yang dapat diuraikan oleh penyedia kueri dan digunakan sesuai.
Sebagai contoh:
IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
Di blok pertama, x => x.Age > 18
adalah metode anonim ( Func<Person, bool>
), yang dapat dieksekusi seperti metode lainnya. Enumerable.Where
akan mengeksekusi metode sekali untuk setiap orang, yield
nilai-nilai yang metode dikembalikan true
.
Di blok kedua, x => x.Age > 18
adalah pohon ekspresi ( Expression<Func<Person, bool>>
), yang dapat dianggap sebagai "adalah properti 'Umur'> 18".
Ini memungkinkan hal-hal seperti LINQ-to-SQL ada karena mereka dapat mengurai pohon ekspresi dan mengubahnya menjadi SQL yang setara. Dan karena penyedia tidak perlu mengeksekusi sampai IQueryable
disebutkan (itu mengimplementasikan IEnumerable<T>
, setelah semua), ia dapat menggabungkan beberapa operator permintaan (dalam contoh di atas Where
dan FirstOrDefault
) untuk membuat pilihan yang lebih cerdas tentang bagaimana menjalankan seluruh permintaan terhadap data yang mendasarinya sumber (seperti menggunakan SELECT TOP 1
dalam SQL).
Lihat: