Выполнение на основе множеств;SQL и .NET - PullRequest
3 голосов
/ 07 октября 2010

В SQL всегда следует стремиться к операциям на основе множеств, а не к итерациям (т. Е. Зацикливанию). В .NET мы часто зацикливаем коллекции и объекты. Есть ли в .NET команды, которые разрешают обработку на основе множеств или все основано на итерациях? (Мне вспоминается, как DataAdapter.Fill вызывает DataReader, который перебирает каждую запись в наборе результатов). Я не очень знаком с LINQ, но думаю, что его реализация просто маскирует итерации, происходящие за кулисами.


UPDATE:

Чтобы уточнить: Я не претендую на то, чтобы быть здесь каким-то гением, и я не буду вторым догадываться о каких-либо блестящих людях, которые делают мою жизнь программирующейся лучше. Команды, которые выполняют основанные на множестве операции, как SQL делает, когда вы UPDATE, в отличие от foreach(var item in obj) { ... }, который явно перебирает объект. Разработчики SQL наказываются на каждом шагу, если они когда-либо используют цикл, но в .NET мы используем их постоянно. Будучи разработчиком, который интенсивно работает как в SQL, так и в .NET, я спрашиваю, есть ли в .NET какие-либо альтернативы, которые вообще исключают циклы.

Ответы [ 2 ]

5 голосов
/ 07 октября 2010

Я не очень знаком с LINQ, но я предполагаю, что его реализация просто маскирует итерации, происходящие за кулисами.

Как вы думаете, как это делает SQL?Дело не в том, что итерации не бывает.Вопрос в том, как вы выражаете свои намерения в коде.Декларативные операции, основанные на множествах, сообщают платформе, чего вы хотите, а затем оставьте ее на усмотрение платформы, чтобы выяснить, как лучше всего это сделать.Это работает, потому что платформы, которые позволяют этот вид кода, являются экспертными системами в своей области, и поэтому намного лучше в этом, чем мог бы надеяться человек.С другой стороны, императивный или процедурный код указывает платформе, что именно делать и как это делать.Это оставляет меньше места для оптимизации машины, обычно требует больше кода и более подвержено ошибкам.

0 голосов
/ 07 октября 2010

LINQ-to-SQL запросы являются операциями, основанными на множестве.Единственная временная итерация происходит, когда вы вызываете GetEnumerator, напрямую или через оператор foreach.

Это работает, потому что LINQ-to-SQL начинается с IQueryable (где T - некоторый класс,действует как суррогат таблицы), и каждая операция LINQ, которую вы применяете к IQueryable <>, возвращает другой IQueryable <>.За кулисами LINQ вообще не обращается к базе данных, а вместо этого создает более сложное выражение LINQ.Когда вы, наконец, попросите перечислить результат, LINQ берет все выражение и преобразует его в SQL-запрос, который передается в базу данных в виде одного запроса.

...