Проверьте утилиту выполняющего мертвую петлю летчика от проект Tempita. Это дает Вам интерфейсный объект вокруг объекта цикла, который обеспечивает свойства такой, поскольку предыдущий, затем, во-первых, продержитесь и т.д.
, Смотрят на исходный код для класса выполняющего мертвую петлю летчика, это довольно просто. Там существуют другие такие помощники цикла, но я не могу помнить других прямо сейчас.
Пример:
> easy_install Tempita
> python
>>> from tempita import looper
>>> for loop, i in looper([1, 2, 3]):
... print loop.previous, loop.item, loop.index, loop.next, loop.first, loop.last, loop.length, loop.odd, loop.even
...
None 1 0 2 True False 3 True 0
1 2 1 3 False False 3 False 1
2 3 2 None False True 3 True 0
Поскольку LINQ не является SQL. LINQ состоит из ряда связанных методов расширения для IEnumerable
(когда вы используете пространство имен System.Linq
). SQL-подобный синтаксис - это просто уловка компилятора, позволяющая включить некоторый синтаксический сахар в цепочки таких методов запросов, поэтому кажется, что вы можете использовать запросы, немного похожие на SQL внутри языков .NET. LINQ не имеет ничего общего с SQL как таковым ...
Потому что для того, чтобы Если Intellisense в Visual Studio работает с LINQ, ему сначала необходимо знать таблицы, чтобы редактор мог предложить программисту список столбцов на выбор. Если вы сделаете это методом SQL и сначала выберете столбцы, редактор не сможет вам помочь, поскольку не знает, какие таблицы смотреть.
Не говоря уже о IntelliSense, расширении выражения запроса и т. Д. (Которые являются вескими причинами), я действительно считаю, что способ LINQ имеет гораздо больший смысл.
Вы начинаете с источник данных. Применяете фильтры, упорядочивание и т. Д. Заканчиваете проекцией. Другими словами, запрос написан в логическом порядке операций.
Другими словами: почему, черт возьми, разработчики SQL решили упорядочивать запросы SQL именно таким образом?
Intellisense часто упоминается как причина, но я думаю, что лучшим объяснением является то, что логически Select происходит в конце процесса написания запроса. Сначала вы настраиваете источники данных, затем фильтруете и группируете, а затем, когда все готово, вы указываете, что хотите получить.
На самом деле, синтаксис LINQ в большей степени основан на XQuery, чем на SQL, и XQuery делает то же самое.
Основные причины уже были указаны: в C #, VB .NET и большинство языков программирования, область видимости движется сверху вниз и слева направо, как мы обычно читаем. При написании SQL область видимости меняется: идентификатор уже используется в части запроса SELECT
, но он будет представлен позже, в FROM
] часть запроса. Вот почему разработчики XQuery решили перевернуть его, и LINQ просто следует.
Он также лучше соответствует ментальной модели: у вас есть список источников данных ( FROM
), затем вы отфильтровываете данные, которые вы нас интересует ( ГДЕ
), затем вы сортируете эти данные ( ORDERBY
) и, наконец, либо проецируете их в другое представление ( SELECT
), либо разделяете результаты ( GROUP BY
). После этого вы можете вставить результаты в следующий запрос ( INTO
).
Часто упоминается, что причина в Intellisense. Потому что, если вы начнете писать
select p.
, компилятор не сможет сказать, какие свойства вам показать.
но если вы начнете с
from person p select p.
, он знает, что нужно искать свойства объекта person.
HTH Алекс
Расширение того, что сказал peSHIr.
LINQ основан на математических принципах лямбда-исчисления.
] Вам необходимо изучить / понять, как операторы запросов LINQ сопоставляются с реальными методами .
В то время как другие правильно заявили, что обеспечение intellisense было одной из причин, повлиявших на решение Андера, необходимо учитывать еще кое-что, что LINQ предназначен не только для используется с SQL. Поскольку это гораздо более всеобъемлющая технология, LINQ никогда не предназначался для ограничения работы только так, как это делает SQL.