IEnumerable<T>mewakili hanya kursor maju dari T. .NET 3.5 menambahkan metode ekstensi yang mencakup LINQ standard query operatorssuka Wheredan 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 > 18adalah metode anonim ( Func<Person, bool>), yang dapat dieksekusi seperti metode lainnya. Enumerable.Whereakan mengeksekusi metode sekali untuk setiap orang, yieldnilai-nilai yang metode dikembalikan true.
Di blok kedua, x => x.Age > 18adalah 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 IQueryabledisebutkan (itu mengimplementasikan IEnumerable<T>, setelah semua), ia dapat menggabungkan beberapa operator permintaan (dalam contoh di atas Wheredan FirstOrDefault) untuk membuat pilihan yang lebih cerdas tentang bagaimana menjalankan seluruh permintaan terhadap data yang mendasarinya sumber (seperti menggunakan SELECT TOP 1dalam SQL).
Lihat: