IEnumerable<T>
, yalnızca ileri imlecini temsil eder T
. .NET 3.5, LINQ standard query operators
benzerleri içeren Where
ve First
tahminler 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 > 18
anonim bir yöntem ( Func<Person, bool>
) bulunur. yöntemin döndürüldüğü değerleri vererek yöntemi Enumerable.Where
her kişi için bir kez yürütür .yield
true
İkinci blokta, "'Yaş' özelliği> 18" olarak düşünülebilecek x => x.Age > 18
bir 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 IQueryable
numaralandı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 Where
ve FirstOrDefault
) kaynak ( SELECT TOP 1
SQL'de kullanmak gibi ).
Görmek: