Apakah Linq atau Lambda?

105

Saya tahu ini Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

Dan saya tahu ini Lambda:

var _Results = _List.Where(x => x.Value == 1);

Catatan Editor: di atas bukan hanya Lambda, ini adalah Linq yang menggunakan "Metode Sintaks" yang predikatnya adalah Lambda. Untuk lebih jelasnya, kedua contoh di atas adalah Linq (posting asli saya salah, tapi saya meninggalkan kesalahan untuk menggambarkan kebingungan yang memicu pertanyaan).

Tetapi apakah Linq merupakan bagian dari Lambda atau apa?

Mengapa ada dua teknisi yang tampaknya identik?

Apakah ada alasan teknis untuk memilih salah satu dari yang lain?

Jerry Nixon
sumber
2
Koreksi: lambdaexpression.net
Jerry Nixon

Jawaban:

135

Ini adalah LINQ (menggunakan sintaks kueri):

var _Results = from item in _List
                where item.Value == 1
                select item;

Ini juga LINQ (menggunakan sintaks metode):

var _Results = _List.Where(x => x.Value == 1);

Menarik untuk dicatat bahwa kedua rasa ini pada akhirnya akan menghasilkan kode yang sama persis. Kompilator menawarkan Anda layanan dengan mengizinkan Anda untuk mengekspresikan keinginan Anda dengan cara yang Anda sukai.

Dan ini lambda:

x => x.Value == 1

Saat Anda memilih untuk menggunakan sintaks metode, LINQ hampir selalu terlihat di sekitar ekspresi lambda. Tetapi LINQ dan lambda adalah dua hal yang sangat berbeda, keduanya dapat digunakan sendiri.

Pembaruan: Seperti yang ditunjukkan oleh svick dengan benar, LINQ dengan sintaks kueri juga diimplementasikan menggunakan ekspresi lambda (seperti yang disebutkan sebelumnya, kompiler memungkinkan Anda untuk menulis dalam sintaks kueri tetapi secara efektif mengubahnya menjadi sintaks metode di belakang Anda). Ini hanya menumpuk pada fakta bahwa kedua rasa benar-benar setara dan akan berperilaku dengan cara yang sama (misalnya ekspresi lambda dapat menyebabkan penutupan dibuat).

Jon
sumber
2
Saya pikir perlu disebutkan bahwa sintaks kueri menggunakan lambda di belakang layar juga. Ini bisa menjadi penting karena penutupan.
svick
34

Keduanya adalah Linq. Yang kedua menggunakan Lambdas .

Lambdas adalah jenis metode inline hal-hal yang Anda teruskan sebagai parameter ke fungsi Di mana dalam contoh kedua.

Perbedaan antara kedua sintaksis tersebut murni sintaksis. Gaya linq kedua menggunakan panggilan metode adalah cara kerjanya di bawah tenda. Yang pertama dimaksudkan agar lebih ramah pengguna / lebih mudah dan kompilator mengubahnya menjadi pemanggilan metode di belakang layar. Mereka harus bekerja sama untuk setiap query yang diberikan meskipun tentu saja compiler dapat memilih interpretasi yang sangat berbeda dari query linq yang rumit daripada yang Anda lakukan saat mengonversi ke gaya metode.

Artikel msdn ini mungkin menarik juga: LINQ Query Syntax versus Method Syntax . Relevansi khusus adalah: "Secara umum, kami merekomendasikan sintaks kueri karena biasanya lebih sederhana dan lebih mudah dibaca; namun tidak ada perbedaan semantik antara sintaks metode dan sintaks kueri."

Chris
sumber
6
Secara pribadi, saya menemukan sintaks metode lebih mudah dibaca - mungkin karena sebagian besar kode saya adalah jenis "LINQ ke Objek". Tetapi jika Anda memiliki banyak pengalaman SQL, mungkin sintaks kueri akan lebih mudah dipahami pada awalnya.
Tom Bushell
@ Tom Bushell, bahkan GABUNG sintaks? Sungguh?
Jerry Nixon
@ Tom Bushell: saya juga. Saya memparafrasekan sesuatu di halaman MSDN yang mungkin menjelaskan mengapa mereka repot-repot mengembangkan sintaks itu daripada hanya memiliki gaya metode. Saya biasanya hanya melakukan hal-hal yang relatif mendasar daripada bergabung atau hal lain yang lebih rumit (yaitu kebanyakan penyaringan atau operasi pemetaan satu lawan satu).
Chris
@ Jerry - seperti Chris, pekerjaan LINQ saya sejauh ini cukup sederhana. Saya telah membaca bahwa Query Syntax biasanya lebih disukai ketika melakukan SelectMany, Join, atau GroupJoin - saya hanya belum perlu melakukan hal seperti itu - belum!
Tom Bushell
1
Secara internal "sintaks kueri" disebut di LINQ ke SQL dan LINQ ke tim Entitas sebagai "sintaks pemahaman".
DamienG