Вопрос

Является ли LINQ новой функцией в .NET 4.0, не поддерживаемой в более старых версиях, таких как .NET 3.5?Для чего это полезно?Кажется, он способен строить Деревья выражений.Что такое дерево выражений на самом деле?Может ли LINQ извлекать информацию, такую как класс, метод и поле, из файла C #?

Может ли кто-нибудь предоставить мне рабочий фрагмент кода, чтобы продемонстрировать, на что способен LINQ?

Это было полезно?

Решение

LINQ это функция .NET 3.5 со встроенной языковой поддержкой C # 3.0 и Visual Basic 2008.Существует множество примеры в MSDN.

Другие советы

Linq был добавлен в .Net 3.5 (и добавлен в компилятор c # 3.0, а также в слегка ограниченной форме в компилятор VB.net в том же выпуске)

In - это интегрированный с языком запрос, хотя он охватывает множество сложных дополнений как к языку, так и к среде выполнения для достижения этой цели, которые полезны сами по себе.

Функциональность выражения - это, проще говоря, способность программы во время выполнения проверять абстрактный синтаксис определенных передаваемых конструкций кода.Они называются лямбдами.И, по сути, являются способом более простого написания анонимных функций, одновременно упрощая самоанализ их структуры во время выполнения.

Функциональность, похожая на SQL, с которой Linq наиболее тесно связана (хотя ни в коем случае не единственная), называется Linq to Sql where чем-то вроде этого:

from f in Foo where s.Blah == "wibble" select f.Wobble;

компилируется в представление этого запроса, а не просто в код для выполнить запрос.Часть, которая делает его linq для sql, - это "серверная часть", которая преобразует его в sql.Для этого выражение преобразуется в инструкции sql server для выполнения запроса к связанной базе данных с отображением строк в объекты .net и преобразованием логики c # в эквивалентные предложения where.Вы могли бы применить точно такой же код, если бы Foo был набором простых объектов .net (в этот момент это "Linq to objects"), тогда преобразование выражения было бы прямым .Net-код.

Приведенный выше лямбда-код, написанный интегрированным с языком способом, на самом деле эквивалентен:

Foo.Где (f => f.Blah == "колебание").Выберите (f => f.Wobble);

Где Foo - это типизированная коллекция.Для баз данных классы синтезируются для представления значений в базе данных, что позволяет как компилировать, так и переводить значения из областей sql в области .net и наоборот.

Важнейший аспект Интегрированный язык частью Linq является то, что результирующие языковые конструкции являются первоклассными частями результирующего кода.Вместо того, чтобы просто приводить к функции, они обеспечивают способ построения функции (в виде выражения), чтобы другие аспекты программы могли манипулировать ею.

Потребители этой функциональности могут просто выбрать ее запуск (выполнить функцию, для которой скомпилирован лямбда-код) или запросить выражение, которое ее описывает, а затем сделать с ней что-то другое.

Многие аспекты того, что делает это возможным, размещены под баннером "Linq", несмотря на то, что на самом деле это не Linq themsleves.
Например, анонимные типы необходимы для удобства использования projection (выбор подмножества возможных свойств), но анонимные типы также могут использоваться вне Linq.

Linq, особенно через лямбды (которые делают написание анонимных делегатов очень легким с точки зрения синтаксиса), привел к увеличению функциональных возможностей c #.это подкрепляется методами расширения на IEnumerable<T> like Select(), соответствующий map во многих функциональных языках и Where(), соответствующий filter.Как и анонимные типы, это само по себе не является "Linq", хотя многие считают, что это оказывает сильное благотворное влияние на разработку c # (это не универсальное мнение, но широко распространенное).

  • Для ознакомления с Linq от Microsoft прочитайте эта статья
  • Введение в использование Linq-to-Sql в Visual Studio см. в разделе эта серия от Скотта Гатри
  • Для получения руководства о том, как вы можете использовать linq, чтобы упростить простой c # при использовании коллекций, прочитайте эта статья

Выражения - это более продвинутая тема, и понимание их совершенно необязательно для использование linq, хотя с их помощью возможны определенные "трюки".В общем, вас бы заботили выражения, только если бы вы пытались написать linq providers, который представляет собой код для принятия выражения, а не просто функции, и использования его для выполнения чего-то отличного от того, что делала бы обычная функция, например, для связи с внешним источником данных.

Другие варианты использования были бы, когда вы хотите получить некоторые метаданные о том, что делают внутренние компоненты функции, возможно, затем скомпилировать выражение (в результате чего появится делегат, который позволит вам выполнить выражение как функцию) и что-то с ним делать или просто просматривать метаданные объектов, чтобы выполнить отражающий код, который проверяется во время компиляции как этот ответ показывает.

Одна из областей этого вопроса, которая еще не была рассмотрена, - это деревья выражений.Доступна действительно хорошая статья о деревьях выражений (и лямбда-выражении) здесь.

Другая важная вещь, которую следует упомянуть о деревьях выражений, заключается в том, что, создавая дерево выражений для определения того, что вы являются собираешься делать, тебе не обязательно на самом деле делай что угодно.Я имею в виду отложенное исполнение.

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());

LINQ был представлен вместе с .NET 3.5. Этот сайт есть много примеров.

Этот вопрос также рассматривается довольно подробно вот на ТАКОМ.

System.Linq.Expressions предназначен для ручного построения (или машинной генерации) деревьев выражений.У меня такое ощущение, что, учитывая сложность создания более сложной функциональности, это пространство имен используется недостаточно.Однако он чрезвычайно силен.Например, один из моих коллег недавно реализовал дерево выражений, которое может автоматически масштабировать любой объект LINQ to SQL, используя функцию кумулятивной плотности.Каждый столбец получает свое собственное дерево, которое компилируется очень быстро.Я создавал специализированный компилятор, который широко использует их для реализации базовой функциональности, а также для склеивания остальной части сгенерированного кода вместе.

Пожалуйста, посмотрите это сообщение в блоге для получения дополнительной информации и идей.

Вот множество Linq-примеров:
http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top