LINQ, (örneğin) bir sorgu anlama sözdizimini temel alan geniş bir teknoloji kümesidir, örneğin:
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
derleyici tarafından koda eşlenen:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
ve burada gerçek sihir başlıyor. Foo
Burada ne olduğunu söylemediğimizi ve derleyicinin umursamadığını unutmayın! Kadar zaman çözebilirsiniz Olarak bazı adlandırılan uygun yöntem Where
bir lambda alabilir ve bunun sonucu olan bazı Select
lambda kabul edebilir yöntemi, bu mutlu.
Şimdi lambda derlenebilir olduğunu düşünün ya , (to-DataSet'in Entities-içeren LINQ nesneleri için, temsilci) anonim bir yönteme veya bir nesne modeli lambda temsil eden bir ifade ağacı için (çalışma zamanı modeli ).
Bellek içi veriler için (tipik olarak IEnumerable<T>
), sadece delegeyi iyi ve hızlı bir şekilde yürütür. Ancak IQueryable<T>
(a LambdaExpression<...>
) ifadesinin nesne temsili için onu ayırabilir ve herhangi bir "LINQ-to-Something" örneğine uygulayabilir.
Veritabanları için (LINQ-to-SQL, LINQ-to-Entities) bu, TSQL yazmak anlamına gelebilir, örneğin:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
Ancak (örneğin ADO.NET Veri Hizmetleri için) bir HTTP sorgusu yazmak anlamına gelebilir.
Az miktarda veri döndüren iyi yazılmış bir TSQL sorgusu yürütmek, tüm veritabanını ağ üzerinden yüklemekten ve ardından istemcide filtrelemekten daha hızlıdır. Her ikisinin de ideal senaryoları ve tamamen yanlış senaryoları var.
Buradaki amaç ve fayda, çok çeşitli veri kaynaklarını sorgulamak için statik olarak kontrol edilen tek bir sözdizimi kullanmanıza olanak sağlamak ve kodu daha anlamlı hale getirmektir (örneğin, verileri gruplamak için "geleneksel" kod, ne yapmaya çalıştığı açısından çok açık - kod kütlesinde kaybolur).