Что такое LINQ на самом деле скомпилированный?
Фон
Основанием для этого является то, что я недавно беседовал в комментариях с другим хорошо осведомленным пользователем о том, как компилируется LINQ. Я первый "суммированы» и сказал, что LINQ был скомпилирован в цикл for. Пока это неПравильно, мое понимание из других стеков, таких какэтот заключается в том, что запрос LINQ компилируется в лямбду с циклом внутри него. Затем он вызывается, когда переменная перечисляется впервые (после чего результаты сохраняются). Другой пользователь сказал, что LINQ требует дополнительных оптимизаций, таких как хеширование. Я не могНайти любую подтверждающую документацию за или против.
Я знаю, что это кажется очень неясным, но я всегда чувствовал, что если я нене понимаю, как что-то работает полностью, будет трудно понять, почему яЯ не использую это правильно.
Вопрос
Итак, давайте рассмотрим следующий очень простой пример:
var productNames =
from p in products
where p.Id > 100 and p.Id < 5000
select p.ProductName;
Что это за утверждениена самом деле скомпилировано в CLR? Какие оптимизации берет на себя LINQ, просто написав функцию, которая анализирует результаты вручную? Это просто семантика или есть что-то большее?
осветление
Я ясноя задаю этот вопрос, потому что я нене понимаю, что внутри LINQ "черный ящик" похоже. Хотя я понимаю, что LINQ сложный (и мощный), яЯ в основном ищу базовое понимание CLR или функционального эквивалента оператора LINQ. Существуют отличные сайты, помогающие понять, как создать оператор LINQ, но очень немногие из них дают какие-либо указания о том, как они на самом деле компилируются или выполняются.
Примечание - Я абсолютно прочитаю серию John Skeet по linq объектам.
Примечание 2 - Я не долженя отметил это как LINQ to SQL. Я понимаю, как ORM 'с и микро-ORM 'с работой. Это действительно помимо сути вопроса.