Linq был добавлен в .Net 3.5 (и добавлен к компилятору c # 3.0, а также в слегка ограниченном виде к компилятору VB.net в том же выпуске)
Это интегрированный с языком запрос, хотя он охватывает множество сложных дополнений как к языку, так и к среде выполнения для достижения этой цели, которые полезны сами по себе.
Функциональность Expression - это просто возможность для программы во время выполнения проверять абстрактный синтаксис определенных передаваемых конструкций кода. Они называются лямбдами. И, по сути, это способ более легко писать анонимные функции, в то же время облегчая самоанализ их структуры во время выполнения.
Функциональность 'SQL like', с которой Linq наиболее тесно связан (хотя отнюдь не единственный), называется Linq to Sql, где что-то вроде этого:
from f in Foo where s.Blah == "wibble" select f.Wobble;
компилируется в представление этого запроса, а не просто код для выполнения запроса. Часть, которая делает его linq to sql, является 'backend', который преобразует его в sql. Для этого выражение переводится в операторы SQL Server для выполнения запроса к связанной базе данных с отображением строк в объекты .net и преобразованием логики c # в эквивалентные выражения where. Вы можете применить точно такой же код, если бы Foo представлял собой набор простых объектов .net (в этот момент это «Linq to objects»), тогда преобразование выражения было бы в прямой код .Net.
Лямбда, написанная выше интегрированным языком, на самом деле эквивалентна:
Foo.Where (f => f.Blah == "wibble). Выберите (f => f.Wobble);
Где Foo - это типизированная коллекция. Для баз данных синтезируются классы для представления значений в базе данных, что позволяет как скомпилировать, так и разрешить циклическое переключение значений из областей sql в области .net и наоборот.
Критическим аспектом Language Integrated части Linq является то, что результирующие языковые конструкции являются частями первого класса результирующего кода. Вместо того, чтобы просто вызывать функцию, они обеспечивают способ, которым функция была построена (как выражение), чтобы другие аспекты программы могли манипулировать ею.
Потребители этой функциональности могут просто захотеть запустить ее (выполнить функцию, для которой скомпилирована лямбда-выражение) или запросить выражение, описывающее ее, а затем сделать с ней что-то другое.
Многие аспекты того, что делает это возможным, помещены под знаменем "Linq", хотя на самом деле они не являются темами Linq.
Например, анонимные типы требуются для простого использования projection
(выбирая подмножество возможных свойств), но анонимные типы могут использоваться и за пределами Linq.
Linq, особенно через лямбды (которые делают написание анонимных делегатов очень легким с точки зрения синтаксиса), привел к расширению функциональных возможностей c #. это подкрепляется методами расширения в IEnumerable<T>
, такими как Select (), что соответствует map
во многих языках функций, и Where (), соответствующее filter
. Подобно анонимным типам, это не само по себе «Linq», хотя многие рассматривают его как очень полезный эффект для развития c # (это не универсальный взгляд, но широко распространенный).
- Для ознакомления с Linq от Microsoft прочитайте эту статью
- Для ознакомления с тем, как использовать Linq-to-Sql в Visual Studio, см. эту серию от Скотта Гатри
- Чтобы узнать, как с помощью linq упростить простой c # при использовании коллекций, прочитайте эту статью
Выражения - более сложная тема, и их понимание совершенно не нужно для использования linq, хотя при их использовании возможны определенные «уловки».В общем, вы бы заботились о выражениях только в том случае, если вы пытались написать провайдеров linq, который представляет собой код для получения выражения, а не просто функцию, и использовать это для выполнения чего-то другого, отличного от того, что делает обычная функция, например для общения с внешним источником данных .
Другое использование будет, когда вы захотите получить некоторые метаданные о том, что делает внутренняя часть функции, возможно, затем скомпилировать выражение (в результате получится делегат, который позволит вам выполнить выражение как функцию) и сделать что-то с ним или просто просматривая метаданные объектов для создания отражающего кода, который во время компиляции проверяется как , этот ответ показывает .