IEnumerable<T>, yalnızca ileri imlecini temsil eder T. .NET 3.5, LINQ standard query operatorsbenzerleri içeren Whereve Firsttahminler veya anonim işlevler gerektiren herhangi bir işleç içeren uzantı yöntemleri ekledi Func<T>.
IQueryable<T>aynı LINQ standart sorgu operatörlerini uygular, ancak Expression<Func<T>>tahminleri ve anonim fonksiyonları kabul eder . Expression<T>derlenmiş bir ifade ağacı, yöntemin sağlayıcı tarafından ayrıştırılabilen ve buna göre kullanılabilen ("eğer yarı yarıya derlenmiş") yöntemin parçalanmış bir sürümüdür.
Örneğin:
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();
İlk blokta, diğer herhangi bir yöntem gibi yürütülebilir x => x.Age > 18anonim bir yöntem ( Func<Person, bool>) bulunur. yöntemin döndürüldüğü değerleri vererek yöntemi Enumerable.Whereher kişi için bir kez yürütür .yieldtrue
İkinci blokta, "'Yaş' özelliği> 18" olarak düşünülebilecek x => x.Age > 18bir ifade ağacı ( Expression<Func<Person, bool>>) bulunur.
Bu, ifade ağacını ayrıştırabildiği ve eşdeğer SQL'e dönüştürebildiği için LINQ-to-SQL gibi şeylerin var olmasını sağlar. Ve sağlayıcının IQueryablenumaralandırılıncaya kadar yürütmesi gerekmediğinden (sonuçta uygular IEnumerable<T>), tüm sorgunun temel verilere karşı nasıl yürütüleceği konusunda daha akıllı seçimler yapmak için birden fazla sorgu operatörünü birleştirebilir (yukarıdaki örnekte Whereve FirstOrDefault) kaynak ( SELECT TOP 1SQL'de kullanmak gibi ).
Görmek: