Apa alasan di balik penamaan .NETs Select (Map) dan Aggregate (Reduce)?

17

Dalam bahasa pemrograman lain, saya telah melihat Peta dan Mengurangi, dan itu adalah landasan pemrograman fungsional. Saya tidak dapat menemukan alasan atau sejarah mengapa LINQ memiliki Aggregate(sama dengan Reduce) dan Select(sama dengan Map)?

Mengapa saya bertanya adalah bahwa saya perlu waktu untuk memahaminya adalah hal yang sama dan saya ingin tahu apa alasannya.

Tx3
sumber
Saya, di sisi lain, akan senang mengetahui alasan di balik penamaan pilihan "Peta" dan agregasi "Mengurangi" untuk memulai.
Den

Jawaban:

32

Ini sebagian besar bermuara pada sejarah LINQ.

LINQ awalnya dimaksudkan untuk menjadi seperti SQL, dan digunakan (sebagian besar, meskipun tidak secara eksklusif) untuk terhubung ke database SQL. Ini mengarah ke banyak terminologi yang didasarkan pada SQL.

Jadi, "pilih" berasal dari SQL selectstatement, dan "agregat" berasal dari fungsi agregat SQL (misalnya, count, sum, avg, min, max).

Bagi mereka yang mempertanyakan sejauh mana LINQ awalnya terkait dengan SQL, saya akan merujuk (misalnya) artikel Microsoft tentang Cω, yang merupakan bahasa yang dirancang oleh Microsoft Research, dan tampaknya menjadi tempat sebagian besar dasar-dasar LINQ bekerja keluar sebelum ditambahkan ke C # dan .NET.

Misalnya, pertimbangkan artikel MSDN di Cω , yang mengatakan:

Operator Permintaan di Cω

Cω menambahkan dua kelas luas operator kueri ke bahasa C #:
- Operator berbasis XPath untuk menanyakan variabel anggota objek berdasarkan nama atau jenis.
- Operator berbasis SQL untuk melakukan kueri canggih yang melibatkan proyeksi, pengelompokan, dan penggabungan data dari satu objek atau lebih.

Setidaknya sejauh yang saya tahu, operator berbasis XPath tidak pernah ditambahkan ke C #, hanya menyisakan operator yang didokumentasikan (sebelum LINQ ada) yang didasarkan langsung pada SQL.

Sekarang, memang benar bahwa LINQ tidak identik dengan operator query berbasis SQL di Cω. Secara khusus, LINQ mengikuti objek dasar dan fungsi pemanggilan fungsi C # lebih dekat daripada Cω. Pertanyaan C followed mengikuti sintaks SQL bahkan lebih dekat, sehingga Anda dapat menulis sesuatu seperti ini (sekali lagi, diambil langsung dari artikel yang ditautkan di atas):

 rows = select c.ContactName, o.ShippedDate
      from c in DB.Customers
      inner join o in DB.Orders
      on c.CustomerID == o.CustomerID;

Dan ya, artikel yang sama tidak berbicara secara khusus tentang menggunakan query berbasis SQL untuk meminta data yang berasal dari database SQL yang sebenarnya:

Untuk terhubung ke database SQL di Cω, itu harus diekspos sebagai kumpulan terkelola (yaitu, file perpustakaan .NET), yang kemudian direferensikan oleh aplikasi. Database relasional dapat diekspos ke Cω sebagai rakitan terkelola baik dengan menggunakan alat baris perintah sql2comega.exe atau dialog Tambah Database Skema ... dari dalam Visual Studio. Objek database digunakan oleh Cω untuk mewakili database relasional yang di-host oleh server. Sebuah database objek memiliki properti publik untuk setiap tabel atau melihat, dan metode untuk setiap fungsi meja-nilai yang ditemukan dalam database. Untuk meminta basis data relasional, fungsi tabel, tampilan, atau nilai tabel harus ditentukan sebagai input ke satu atau lebih operator berbasis SQL.

Program sampel dan output berikut menunjukkan beberapa kemampuan menggunakan operator berbasis SQL untuk query database relasional di Cω. Basis data yang digunakan dalam contoh ini adalah contoh basis data Northwind yang dilengkapi dengan Microsoft SQL Server. Nama DB yang digunakan dalam contoh ini merujuk ke turunan global dari objek Database di Northwind namespace dari perakitan Northwind.dll yang dihasilkan menggunakan sql2comega.exe .

Jadi, ya, dari awal (atau bahkan sebelum awal, tergantung pada sudut pandang Anda) LINQ secara eksplisit didasarkan pada SQL, dan dimaksudkan secara khusus untuk memungkinkan akses ke data dalam database SQL.

Jerry Coffin
sumber
5
Saya tidak setuju bahwa LINQ diciptakan untuk query SQL. LINQ didasarkan pada operasi kueri di , yang pada gilirannya mewarisinya dari X♯, yang didasarkan pada kertas Haskell lama. Perhatikan bahwa salah satu penulis makalah Haskell tersebut adalah Erik Meijer, yang juga terlibat dalam desain X♯ dan Cω setelah itu, dan tentu saja perancang LINQ. Dan sudah jelas sejak awal bahwa LINQ dapat digunakan untuk menanyakan segala macam hal, bukan hanya SQL (dikirimkan dengan LINQ-to-SQL, LINQ-to-XML, dan LINQ-to-Objects sejak hari 1, tak lama diikuti oleh ...
Jörg W Mittag
4
LINQ-to-Entities), dan faktanya lebih dari sekadar query (pada dasarnya sintaksis Monad Comprehension ). Itu dirancang untuk keakraban dengan programmer SQL (dan XQuery), tetapi tentu saja tidak terbatas pada itu. Dalam nada yang sama, Pemahaman Monad Scala terlihat seperti forloop, dan tampilan Haskell seperti blok kode imperatif gaya-C, dan Scala menyebut operasi monadiknya flatMap, dan Haskell menyebutnya returndengan alasan yang sama: untuk menyesuaikan dengan "ilusi" yang dicegah untuk (mantan) programmer penting.
Jörg W Mittag
2
@ JörgWMittag: Lihat jawaban yang diedit. Saya percaya bahwa dokumentasi Microsoft mendukung pernyataan saya.
Jerry Coffin
3
+1 untuk benar-benar menjustifikasi jawaban alih-alih menebak-nebak. Anda tidak bisa mendapatkan lebih banyak sumber otoritatif daripada Microsoft sendiri.
milleniumbug
Terima kasih, tuan! Ini adalah jawaban yang saya harapkan.
Tx3
8

Metode LINQ di .Net

source.Where(x => condition)
      .Select(x => projection)

dinamai konsisten dengan sintaks query LINQ dalam C # (dan VB.NET)

from x in source
where condition
select projection

yang dirancang agar tidak asing bagi orang yang tahu SQL

SELECT projection
FROM source x
WHERE condition
svick
sumber
2

Bagi saya, Pilih dan Agregat lebih masuk akal. Ketika entitas menjadi metode dominan untuk query dan memanipulasi data dalam. Net, Linq semakin banyak digunakan oleh pengembang yang mungkin terbiasa bekerja dengan data melalui SQL. Jadi, menggunakan kata-kata seperti "Pilih" lebih masuk akal bagi para pengembang tersebut, karena itulah kata kunci yang biasa mereka gunakan.

Christine
sumber
4
"semakin banyak oleh pengembang yang mungkin terbiasa bekerja dengan data melalui SQL" Saya ragu ini. Orang yang bekerja sama dengan saya yang menyanyikan pujian Entity Framework tidak tahu bahwa ia perlu melakukan INNER JOINsatu hari saja ketika Entity Framework bukan pilihan. Mungkin justru sebaliknya. Semakin banyak orang menggunakan LINQ setiap hari yang secara aktif menghindari penulisan SQL. Orang-orang yang nyaman dalam SQL mungkin hanya berbuat lebih banyak dalam SQL.
jpmc26
1
Bukan itu yang saya lihat. Terutama apa yang saya temukan (melalui pencarian pekerjaan saya baru-baru ini) adalah bahwa pengembang yang pernah bekerja dengan data menggunakan Prosedur Tersimpan mulai melakukan semua skrip mereka di controller. Bagi saya, membantu Linq menggunakan ekspresi yang sudah dikenal. Saya tidak meragukan itu adalah kasus untuk "orang yang bekerja dengan Anda," tetapi itu bukan pengalaman saya.
Christine