Qual è il ragionamento alla base della denominazione di .NETs Select (Map) e Aggregate (Reduce)?


17

In altri linguaggi di programmazione, ho visto Map and Reduce, e questi sono i cardini della programmazione funzionale. Non sono riuscito a trovare alcun ragionamento o storia per cui LINQ ha Aggregate(lo stesso di Reduce) e Select(lo stesso di Map)?

Perché sto chiedendo è che mi ci è voluto un po 'di tempo per capire che è la stessa cosa e sono curioso di sapere qual è il ragionamento per questo.




D'altro canto, mi piacerebbe conoscere il ragionamento alla base della selezione dei nomi "Mappa" e dell'aggregazione "Riduci" per cominciare.
Den

Risposte:


32

Questo dipende principalmente dalla storia di LINQ.

Originariamente LINQ doveva essere simile a SQL e utilizzato (ampiamente, ma non esclusivamente) per connettersi a database SQL. Ciò porta a gran parte della sua terminologia basata su SQL.

Quindi, "selezionare" venuto dal SQL selectdichiarazione, e "aggregato" è venuto da funzioni di aggregazione SQL (ad esempio, count, sum, avg, min, max).

Per coloro che mettono in dubbio il grado in cui LINQ originariamente si riferiva a SQL, farei riferimento (ad esempio) agli articoli di Microsoft su Cω, che era un linguaggio ideato da Microsoft Research, e sembra essere il luogo in cui sono state lavorate la maggior parte delle basi di LINQ prima che fossero aggiunti a C # e .NET.

Ad esempio, considera un articolo MSDN su Cω , che dice:

Operatori di query in Cω

Cω aggiunge due ampie classi di operatori di query al linguaggio C #:
- Operatori basati su XPath per eseguire query sulle variabili membro di un oggetto per nome o per tipo.
- Operatori basati su SQL per l'esecuzione di query sofisticate che coinvolgono proiezione, raggruppamento e unione di dati da uno o più oggetti.

Almeno per quanto ne so, gli operatori basati su XPath non sono mai stati aggiunti a C #, lasciando solo gli operatori documentati (prima che esistesse LINQ) come direttamente basati su SQL.

Ora, è certamente vero che LINQ non è identico agli operatori di query basati su SQL in Cω. In particolare, LINQ segue gli oggetti di base di C # e la sintassi delle chiamate di funzione molto più da vicino di Cω. Le query Cω hanno seguito la sintassi SQL ancora più da vicino, quindi è possibile scrivere qualcosa del genere (di nuovo, disegnato direttamente dall'articolo collegato sopra):

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

E sì, lo stesso articolo parla in particolare dell'utilizzo delle query basate su SQL per eseguire query sui dati provenienti da database SQL effettivi:

Per connettersi a un database SQL in Cω, deve essere esposto come assembly gestito (ovvero un file di libreria .NET), a cui fa riferimento l'applicazione. Un database relazionale può essere esposto a un Cω come assembly gestito utilizzando lo strumento da riga di comando sql2comega.exe o la finestra di dialogo Aggiungi schema database ... da Visual Studio. Gli oggetti di database sono usati da Cω per rappresentare il database relazionale ospitato dal server. Un oggetto Database ha una proprietà pubblica per ogni tabella o vista e un metodo per ogni funzione con valori di tabella presente nel database. Per eseguire una query su un database relazionale, è necessario specificare una tabella, una vista o una funzione con valori di tabella come input per uno o più operatori basati su SQL.

Il seguente programma di esempio e l'output mostrano alcune delle funzionalità dell'utilizzo degli operatori basati su SQL per eseguire query su un database relazionale in Cω. Il database utilizzato in questo esempio è il database Northwind di esempio fornito con Microsoft SQL Server. Il DB nome utilizzato nell'esempio riferisce ad un'istanza globale di un oggetto Database nella Northwind namespace del Northwind.dll assembly generato usando sql2comega.exe .

Quindi sì, sin dall'inizio (o anche prima dell'inizio, a seconda del punto di vista) LINQ era esplicitamente basato su SQL e intendeva specificamente consentire l'accesso ai dati nei database SQL.


5
Non sono d'accordo sul fatto che LINQ sia stato inventato per le query SQL. LINQ si basa sulle operazioni di query in , che a loro volta le hanno ereditate da X♯, che si basa su un vecchio documento di Haskell. Si noti che uno degli autori di tali articoli di Haskell è Erik Meijer, che è stato anche coinvolto nella progettazione di X♯ e Cω, ed è ovviamente il designer di LINQ. Ed era chiaro fin dall'inizio che LINQ poteva essere usato per interrogare ogni genere di cose, non solo SQL (fornito con LINQ-to-SQL, LINQ-to-XML e LINQ-to-Objects dal primo giorno, a breve seguito da ...
Jörg W Mittag,

4
LINQ-to-Entities), e in effetti per molto più che una query (è sostanzialmente una sintassi generale di Monad Comprensione ). È stato progettato per familiarità con i programmatori SQL (e XQuery), ma certamente non limitato a questo. Allo stesso modo, la comprensione della monade di Scala assomiglia ad foranelli, e quella di Haskell come blocchi di codice imperativo in stile C, e quindi Scala chiama la sua operazione monadica flatMap, e Haskell la chiama returnper lo stesso motivo: adattarsi con l '"illusione" impedita di (ex) programmatori imperativi.
Jörg W Mittag,

2
@ JörgWMittag: vedi la risposta modificata. Credo che la documentazione di Microsoft supporti le mie dichiarazioni.
Jerry Coffin,

3
+1 per giustificare effettivamente la risposta invece di indovinare con desiderio. Non puoi ottenere una fonte molto più autorevole della stessa Microsoft.
Milleniumbug,

Grazie signore! Questo è esattamente il tipo di risposta che speravo di ricevere.
Tx3,

8

Metodi LINQ in .Net

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

sono stati nominati per essere coerenti con la sintassi della query LINQ in C # (e VB.NET)

from x in source
where condition
select projection

che è stato progettato per essere familiare alle persone che conoscono SQL

SELECT projection
FROM source x
WHERE condition

2

Per me, selezionare e aggregare ha più senso. Man mano che l'entità diventa il metodo dominante per interrogare e manipolare i dati in .Net, Linq viene sempre più utilizzato dagli sviluppatori che probabilmente sono abituati a lavorare con i dati tramite SQL. Quindi, usare parole come "Seleziona" ha più senso per quegli sviluppatori, perché quelle sono le parole chiave a cui sono abituati.


4
"Sempre più sviluppatori che sono probabilmente abituati a lavorare con i dati tramite SQL" Ne dubito. Il ragazzo con cui lavoro, che canta le lodi di Entity Framework, non è riuscito a capire che INNER JOINun giorno avrebbe dovuto fare un singolo giorno quando Entity Framework non era un'opzione. Probabilmente il contrario. Sempre più persone usano LINQ ogni giorno che evitano attivamente di scrivere SQL. Le persone che si sentono a proprio agio in SQL probabilmente fanno semplicemente di più in SQL.
jpmc26,

1
Non è quello che ho visto. Soprattutto quello che sto scoprendo (attraverso la mia recente ricerca di lavoro) è che gli sviluppatori che una volta hanno lavorato con i dati utilizzando Stored Procedure stanno iniziando a fare tutti i loro script nel controller. Per me, aiuta Linq ad usare espressioni familiari. Non dubito che sia il caso del "ragazzo con cui lavori", ma non è la mia esperienza.
Christine,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.