Каковы причины именования .NETs Select (Карта) и Aggregate (Уменьшить)?


17

В других языках программирования я видел Map и Reduce, и это краеугольные камни функционального программирования. Я не мог найти никаких рассуждений или истории, почему LINQ имеет Aggregate(так же, как Reduce) и Select(так же, как Map)?

Почему я спрашиваю, это то, что мне потребовалось некоторое время, чтобы понять, что это одно и то же, и мне любопытно, какова причина этого.




Я, с другой стороны, хотел бы знать причины выбора имен «Карта» и агрегации «Уменьшить» для начала.
Ден

Ответы:


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 или диалога Add Database Schema ... из 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-to-SQL, LINQ-to-XML и LINQ-to-Objects с первого дня) а затем ...
Йорг Миттаг

4
LINQ-to-Entities), и на самом деле это гораздо больше, чем просто запросы (в основном это общий синтаксис Monad-понимания ). Он был разработан для знакомства с программистами SQL (и XQuery), но, конечно, этим не ограничивается. В том же духе, Монадические Понимания Scala выглядят как forциклы, а Haskell - как императивные блоки кода в стиле C, и поэтому Scala вызывает свою монадическую операцию flatMap, а Haskell вызывает ее returnпо той же причине: чтобы соответствовать «иллюзии», предотвращенной (бывшие) императивные программисты.
Йорг Миттаг,

2
@ JörgWMittag: см. Отредактированный ответ. Я считаю, что документация Microsoft поддерживает мои заявления.
Джерри Коффин

3
+1 за фактическое обоснование ответа, а не заумное гадание. Вы не можете получить гораздо более авторитетный источник, чем сами Microsoft.
Milleniumbug

Спасибо, хорошо, сэр! Это именно тот ответ, который я надеялся получить.
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

Для меня выбор и агрегирование имеют больше смысла. Поскольку сущность становится доминирующим методом для запросов и манипулирования данными в .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.