Ответ 1
Трудно ответить на вопрос, потому что LINQ - это очень много разных вещей. Например, придерживаясь С#, задействованы следующие вещи:
- Выражения запросов "предварительно обработаны" в "С# без выражений запроса", которые затем скомпилируются в обычном режиме. Часть выражения запроса спецификации очень короткая - это в основном механический перевод, который не предполагает ничего о реальном значении запроса, кроме "order by, переведенный в OrderBy/ThenBy/etc".
- Делегаты используются для представления произвольных действий с определенной сигнатурой в качестве исполняемого кода.
- Деревья выражений используются для представления одной и той же вещи, но как данные (которые могут быть рассмотрены и переведены в другую форму, например SQL)
- Лямбда-выражения используются для преобразования исходного кода в делегаты или деревья выражений.
- Методы расширения используются большинством провайдеров LINQ для объединения вызовов статических методов. Это позволяет простому интерфейсу (например,
IEnumerable<T>
) эффективно получать намного больше мощности. - Анонимные типы используются для прогнозов - там, где у вас есть некоторая разрозненная коллекция данных, и вам нужны биты каждого из аспектов этих данных, анонимный тип позволяет вам собирать их вместе.
- Неявно введенные локальные переменные (
var
) используются, прежде всего, при работе с анонимными типами, для поддержания статически типизированного языка, где вы не можете "явно говорить" имя типа явно. - Блоки Iterator обычно используются для реализации запросов в процессе, например. для LINQ to Objects.
- Тип вывода используется для того, чтобы сделать все это более гладко - в LINQ существует много общих методов, и без вывода типа было бы очень больно.
- Генерация кода используется для превращения модели (например, DBML) в код
- Частичные типы используются для обеспечения расширяемости сгенерированного кода
- Атрибуты используются для предоставления метаданных поставщикам LINQ
Очевидно, что многие из них используются не только LINQ, но и другие технологии LINQ будут зависеть от них.
Если вы можете дать больше информации о том, какие аспекты вас интересуют, мы можем предоставить более подробную информацию.
Если вы заинтересованы в эффективном внедрении LINQ to Objects, вы можете быть заинтересованы в разговоре, который я дал в DDD в Чтении пару недель назад, - в основном, используя как можно больше LINQ для объектов через час. Мы были далеки от завершения к концу, но это должно дать довольно хорошее представление о том, что вам нужно делать (и буферизации/потоковой передаче, блоках итератора, переводе выражения запроса и т.д.). Видео еще не подняты (и я еще не добавил код для скачивания), но если вам интересно, напишите мне письмо по адресу [email protected], и я сообщу вам, когда они встанут, (Вероятно, я тоже расскажу об этом.)