Які міркування називати .NETs Select (Map) та Aggregate (Зменшити)?


17

В інших мовах програмування я бачив Map and Reduce, і це є основою функціонального програмування. Я не міг знайти жодних міркувань чи історії, чому LINQ має Aggregate(те саме Reduce) і Select(те саме, що Map)?

Чому я прошу, що мені знадобився певний час, щоб зрозуміти, що це одне й те саме, і мені цікаво, що це за міркування.




Я, з іншого боку, хотів би знати міркування про названня вибору "Карта" та сукупності "Зменшити" для початку.
Den

Відповіді:


32

В основному це зводиться до історії LINQ.

Спочатку LINQ мав бути схожим на SQL і використовувався (значною мірою, але не виключно) для підключення до баз даних SQL. Це призводить до того, що значна частина його термінології базується на SQL.

Таким чином, «виберіть» прийшов з SQL selectзаяви, а «агрегат» прийшов з агрегатних функцій SQL (наприклад, count, sum, avg, min, max).

Для тих, хто ставить під сумнів ступінь, до якого LINQ спочатку стосувався SQL, я б посилався на (наприклад) статті Microsoft про Cω, що була мовою, розроблена Microsoft Research, і, здається, там, де працювала більшість основ LINQ до того, як їх додали до C # та .NET.

Наприклад, розглянемо статтю MSDN про Cω , де сказано:

Оператори запитів у Cω

Cω додає два широких класи операторів запитів до мови C #:
- Оператори на основі XPath для запиту змінних членів об’єкта за назвою чи типом.
- Оператори на основі SQL для виконання складних запитів, що включають проекцію, групування та об'єднання даних з одного або декількох об'єктів.

Принаймні, наскільки я знаю, оператори на базі XPath ніколи не додавалися до C #, залишаючи лише ті оператори, які були задокументовані (до існування LINQ), як такі, що базуються безпосередньо на SQL.

Тепер, безумовно, вірно, що LINQ не ідентичний операторам запитів на основі SQL в Cω. Зокрема, LINQ слідує за основними об'єктами та функціями C # синтаксисом набагато ближче, ніж це робив Cω. Запити Cω ще більше уважно стежили за синтаксисом SQL, тож ви можете написати щось подібне (знову ж таки, витягнутий безпосередньо із статті, що пов’язана вище):

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

І так, в цій же статті йдеться конкретно про використання запитів на основі SQL для запиту даних, що надходять із фактичних баз даних SQL:

Щоб підключитися до бази даних SQL в Cω, вона повинна бути викрита як керована збірка (тобто файл бібліотеки .NET), на який потім посилається додаток. Реляційна база даних може бути піддана дії Cω як керованої збірки або за допомогою інструменту командного рядка sql2comega.exe або схеми Додати базу даних ... діалогового вікна з Visual Studio. Об'єкти бази даних використовуються Cω для представлення реляційної бази даних, розміщеної сервером. База даних об'єкт має відкрите властивість для кожної таблиці або уявлень, а також методу для кожної функції табличній знайденої в базі даних. Для запиту на реляційну базу даних функція таблиці, перегляду або таблиці повинна бути вказана як вхід до одного або декількох операторів на базі SQL.

Наведені нижче приклади програми та результату показують деякі можливості використання операторів на основі SQL для запиту реляційної бази даних у Cω. База даних, що використовується в цьому прикладі, є зразком бази даних Northwind, яка постачається разом із Microsoft SQL Server. Ім'я БД , що використовується в прикладі відноситься до глобального примірника об'єкта бази даних в Northwind простору імен Northwind.dll збірки , що генеруються з використанням sql2comega.exe .

Так, так, з самого початку (або навіть перед початком, залежно від точки зору) LINQ явно базувався на SQL і призначений спеціально для доступу до даних у базах даних SQL.


5
Я не погоджуюся, що LINQ був винайдений для запитів SQL. LINQ ґрунтується на операціях запиту в , який, у свою чергу, успадкував їх від X♯, який базується на старому папері Haskell. Зауважимо, що одним з авторів згаданих робіт Haskell є Ерік Мейєр, який також після цього брав участь у розробці X♯ і Cω, і, звичайно, є дизайнером LINQ. І з самого початку було зрозуміло, що LINQ може використовуватися для запиту всіляких речей, не тільки SQL (він постачається разом з LINQ-в-SQL, LINQ-в-XML та LINQ-до-об'єктів, незабаром далі ...
Йорг W Міттаг

4
LINQ-to-Entities), і насправді набагато більше, ніж запити (це в основному загальний синтаксис Monad Compression). Він був розроблений для ознайомлення з програмістами SQL (і XQuery), але, безумовно, цим не обмежувався. Аналогічно, монаші ​​Погляди Скели виглядають як forпетлі, а Хаскелл - як імперативні кодові блоки стилю С, і тому Скала називає його монадійною роботою flatMap, а Хаскелл називає це returnз тієї ж причини: підходити до "ілюзії", яку заважає (колишні) імперативні програмісти.
Йорг W Міттаг

2
@ JörgWMittag: Див. Відредаговану відповідь. Я вважаю, що документація Microsoft підтримує мої заяви.
Джеррі Труну

3
+1 за те, що насправді виправдовує відповідь замість бажання гадати. Ви не можете отримати набагато авторитетніше джерело, ніж самі Microsoft.
тисячоліття

Дякую, чудовий пане! Це саме та відповідь, яку я сподівався отримати.
Tx3

8

Методи LINQ в .Net

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

були названі так, щоб вони відповідали синтаксису запитів LINQ в C # (і VB.NET)

from x in source
where condition
select projection

який був розроблений так, щоб бути знайомим людям, які знають SQL

SELECT projection
FROM source x
WHERE condition

2

Для мене "Select and Aggregate" має більше сенсу. Оскільки сутність стає домінуючим методом запитів і маніпулювання даними в .Net, Linq все більше використовується розробниками, які, ймовірно, звикли працювати з даними через SQL. Тож використання таких слів, як "Вибрати", має більше сенсу для тих розробників, оскільки це ключові слова, до яких вони звикли.


4
"все більше і більше розробників, які, ймовірно, звикли працювати з даними через SQL". Хлопець, з яким я працюю, який співає похвали Entity Framework, не міг зрозуміти, що йому потрібно зробити INNER JOINодин день, коли Entity Framework не був можливим. Напевно, зовсім навпаки. Все більше і більше людей використовують LINQ щодня, які активно уникають написання SQL. Люди, яким зручно в SQL, напевно, просто більше роблять більше в SQL.
jpmc26

1
Це не те, що я бачив. Головним чином, що я знаходжу (завдяки моєму недавному пошуку роботи), це те, що розробники, які колись працювали з даними, використовуючи Збережені процедури, починають робити всі свої сценарії в контролері. Для мене це допомагає, що Linq використовує знайомі вирази. Я не сумніваюся, що це стосується "хлопця, з яким ти працюєш", але це не мій досвід.
Крістін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.