LINQ adalah sekumpulan teknologi yang luas, berdasarkan di sekitar (misalnya) sintaks pemahaman kueri, misalnya:
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
yang dipetakan oleh kompilator menjadi kode:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
dan di sini keajaiban yang sesungguhnya dimulai. Perhatikan bahwa kami belum mengatakan apa yang Foo
ada di sini - dan kompiler tidak peduli! Selama itu dapat menyelesaikan beberapa metode yang sesuai disebut Where
yang dapat mengambil lambda, dan hasilnya ada beberapa Select
metode yang dapat menerima lambda, itu senang.
Sekarang mempertimbangkan bahwa lambda dapat dikompilasi baik dalam metode anonim (delegasi, untuk LINQ-to-Objects, yang mencakup LINQ-to-DataSet), atau untuk ekspresi-pohon (model runtime yang mewakili lambda dalam model objek ).
Untuk data dalam memori (biasanya IEnumerable<T>
), ini hanya mengeksekusi delegasi - dengan baik dan cepat. Tapi untuk IQueryable<T>
objek-representasi ekspresi (aLambdaExpression<...>
) itu dapat memisahkannya dan menerapkannya pada contoh "LINQ-to-Something".
Untuk database (LINQ-to-SQL, LINQ-to-Entities) ini mungkin berarti menulis TSQL, misalnya:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
Tapi itu bisa (untuk ADO.NET Data Services, misalnya) berarti menulis permintaan HTTP.
Menjalankan kueri TSQL yang ditulis dengan baik yang mengembalikan sejumlah kecil data lebih cepat daripada memuat seluruh database melalui jaringan dan kemudian memfilter di klien. Keduanya memiliki skenario ideal dan skenario yang salah.
Tujuan dan manfaat di sini adalah untuk memungkinkan Anda menggunakan sintaks tunggal yang diperiksa statis untuk menanyakan berbagai sumber data, dan membuat kode lebih ekspresif (kode "tradisional" untuk mengelompokkan data, misalnya, tidak sangat jelas dalam hal apa yang coba dilakukannya - itu hilang dalam massa kode).