Почему дизайнеры LINQ не придерживались способа использования sql?
Например, почему вы делаете это в LINQ
var products = from p in Products
select p.Name;
когда они могли бы это сделать:
var products = select p.Name from Products p;
Предоставляет ли второе предложение некоторые ограничения в linq?
Возможно, приведенные выше примеры слишком просты, чтобы понять, почему linq написан в одном порядке, а sql написан в другом.
Ответы
Ответ 1
Поскольку LINQ не является SQL. LINQ состоит из нескольких цепочечных методов расширения на IEnumerable<T>
(при использовании пространства имен System.Linq
). Синтаксис SQL как простой трюк компилятора для включения синтаксического сахара в цепочках таких методов запросов, поэтому кажется, что вы можете использовать запросы, похожие на SQL внутри языков .NET. LINQ в основном не имеет ничего общего с SQL...
Ответ 2
Поскольку для того, чтобы Intellisense в Visual Studio работал с LINQ, ему сначала нужно знать таблицы, чтобы редактор мог предложить программисту список столбцов на выбор. Если вы сделаете это методом SQL и сначала вы выберете столбцы, редактор не сможет вам помочь, так как он не знает, на какие таблицы смотреть.
Ответ 3
Оставляя в стороне IntelliSense, расширение выражений запроса и т.д. (которые все являются действительной причиной), я действительно считаю, что способ LINQ имеет гораздо больший смысл.
Вы начинаете с источника данных. Вы применяете фильтры, заказываете и т.д. Вы заканчиваете проекцией. Другими словами, запрос записывается в логическом порядке операций.
Иными словами, почему дизайнеры SQL решили упорядочить SQL-запросы таким образом?
Ответ 4
Intellisense часто упоминается как причина, но я думаю, что лучшее объяснение заключается в том, что Select логически происходит в конце процесса записи запроса. Сначала вы настраиваете свои источники данных, затем фильтруете и группируете, а затем, когда у вас есть все на своем месте, вы указываете, что хотите выйти.
Ответ 5
Часто упоминается, что причиной является Intellisense. Потому что, если вы начинаете писать
select p.
компилятор не может сказать, какие свойства показывать вам.
но если вы начинаете с
from person p select p.
он знает, как искать свойства объекта person.
НТН
Алекс
Ответ 6
На самом деле, синтаксис LINQ более тесно основан на XQuery, чем на SQL, и XQuery тоже делает это.
Основные причины уже приведены: в С#, VB.NET и, действительно, большинстве языков программирования область видимости распространяется сверху вниз и слева направо, так же, как мы обычно читаем. Способ записи SQL, область скачков: идентификатор уже используется в части SELECT
запроса, но он вводится позже, в части FROM
запроса. Вот почему дизайнеры XQuery решили перевернуть его, и LINQ просто следует.
Он также лучше соответствует ментальной модели: у вас есть список источников данных (FROM
), затем вы отфильтровываете интересующие вас данные (WHERE
), затем сортируете эти данные (ORDERBY
) и, наконец, вы либо проецируете его в другое представление (SELECT
), либо разделите результаты (GROUP BY
). После этого вы можете ввести результаты в следующий запрос (INTO
).
Ответ 7
Расширение того, что сказал peSHIr.
LINQ основан на математических принципах лямбда-исчисления.
Вам нужно изучить/понять, как операторы запросов LINQ сопоставляются с фактическими методами.
Ответ 8
В то время как другие правильно заявили, что предоставление intellisense является частью причины, повлиявшей на решение Ander, что-то еще, что нужно учитывать, заключается в том, что LINQ не просто предназначен для использования с SQL. Поскольку это гораздо более всеобъемлющая технология, LINQ никогда не предназначался для того, чтобы быть ограниченным, чтобы просто работать так, как это делает SQL.