Что такое LINQ и что он делает?

Что такое LINQ? Я знаю, что это для баз данных, но что он делает?

LINQ означает Language Integrated Query .

Вместо того, чтобы писать YAQL (еще один язык запросов), разработчики языка Microsoft предоставили возможность выражать запросы непосредственно на своих языках (например, C # и Visual Basic). Методы формирования этих запросов не зависят от деталей реализации запрашиваемой вещи, поэтому вы можете писать достоверные запросы по многим объектам (базам данных, объектам в памяти, XML) практически без учета основного способа, которым запрос будет выполнен.

Давайте начнем исследование с частей, принадлежащих .NET Framework (3.5).

  • LINQ To Objects – проверить System.Linq.Enumerable для методов запросов. Эти целевые IEnumerable , позволяющие запрашивать любую типизированную циклическую коллекцию безопасным образом. Эти запросы зависят от скомпилированных методов .NET, а не от выражений.

  • LINQ To Anything – рассмотрите System.Linq.Queryable для некоторых методов запросов. Эти целевые IQueryable , позволяющие построить деревья выражений, которые могут быть переведены с помощью базовой реализации.

  • Деревья выражений – рассмотрите пространство имен System.Linq.Expressions . Это код как данные. На практике вы должны знать об этом, но на самом деле не нужно писать код против этих типов. Языковые функции (например, lambda-выражения) могут позволить вам использовать различные короткие руки, чтобы не обращаться к этим типам напрямую.

  • LINQ To SQL – проверьте пространство имен System.Data.Linq . Особенно обратите внимание на DataContext . Это технология DataAccess, созданная командой C #. Это просто работает.

  • LINQ To Entities – просмотр пространства имен System.Data.Objects . Особенно обратите внимание на ObjectContext . Это технология DataAccess, созданная командой ADO.NET. Он сложный, мощный и сложнее в использовании, чем LINQ To SQL.

  • LINQ To XML – проверьте пространство имен System.Xml.Linq . По сути, люди не были довольны материалом в System.Xml . Таким образом, Microsoft перезаписала его и воспользовалась переписыванием, чтобы представить некоторые методы, облегчающие использование LINQ To Objects против XML.

  • Некоторые хорошие вспомогательные типы, такие как Func и Action . Эти типы являются делегатами с общей поддержкой. Прошли те времена, когда вы объявляли свои собственные (и неперепутаемые) типы делегатов.

Все это является частью .NET Framework и доступно на любом языке .NET (VB.NET, C #, IronPython, COBOL .NET и т. Д.).


Хорошо, по языковым возможностям. Я буду придерживаться C #, так как это то, что я знаю лучше всего. У VB.NET также было несколько подобных улучшений (и пара, которую C # не получал – XML-литералы). Это короткий и неполный список.

  • Методы расширения – это позволяет вам «добавить» метод для ввода. Метод действительно является статическим методом, которому передается экземпляр типа и ограничен публичным контрактом типа, но он очень полезен для добавления методов к типам, которые вы не контролируете (строка), или добавлению (полностью реализовано ) вспомогательные методы для интерфейсов.

  • Синтаксис понимания запроса – это позволяет вам писать в структуре SQL Like. Весь этот материал переводится в методы System.Linq.Queryable или System.Linq.Enumerable (в зависимости от типа myCustomers). Это совершенно необязательно, и вы можете использовать LINQ без него. Одним из преимуществ этого стиля объявления запроса является то, что переменные диапазона имеют область действия: они не требуют повторного объявления для каждого предложения.

     IEnumerable result = from c in myCustomers where c.Name.StartsWith("B") select c.Name; 
  • Лямбда-выражения – это сокращение для указания метода. Компилятор C # переводит каждый в анонимный метод или в истинное System.Linq.Expressions.Expression . Вам действительно нужно понять, что они хорошо используют Linq. Есть три части: список параметров, стрелка и тело метода.

     IEnumerable result = myCustomers .Where(c => c.Name.StartsWith("B")) .Select(c => c.Name);` 
  • Анонимные типы. Иногда у компилятора достаточно информации для создания типа для вас. Эти типы не являются поистине анонимными: компилятор называет их, когда он их создает. Но эти имена создаются во время компиляции, что слишком поздно для разработчика, чтобы использовать это имя во время разработки.

     myCustomers.Select(c => new { Name = c.Name; Age = c.Age; }) 
  • Неявные типы. Иногда у компилятора достаточно информации из инициализации, что он может определить тип для вас. Вы можете дать команду компилятору сделать это, используя ключевое слово var. Неявная типизация требуется для объявления переменных для анонимных типов, поскольку программисты не могут использовать имя анонимного типа.

     // The compiler will determine that names is an IEnumerable var names = myCustomers.Select(c => c.Name); 

LINQ (Language INtegrated Query) может ссылаться на:

  • библиотека для сбора и обработки iteratorов, которая широко использует функции более высокого порядка в качестве аргументов (System.Linq)

  • библиотека для передачи и обработки простых функций в виде абстрактных синтаксических деревьев (System.Linq.Expressions)

  • расширение синтаксиса для разных языков, чтобы обеспечить более синтаксис SQL для обработки коллекций, более компактную нотацию для анонимных функций и механизм для введения статических вспомогательных функций, синтаксически неотличимых от конечных функций-членов

  • определение интерфейса, которому поставщики данных могут соответствовать, чтобы получать структуру запроса и потенциально выполнять оптимизацию на них, или иногда сами совместимые поставщики данных

Компоненты могут использоваться в изоляции или в сочетании.

В двух словах LINQ (Language-Integrated Query) позволяет писать запросы непосредственно в вашем коде. Эти запросы могут быть связаны с реляционными базами данных, а также с объектами контейнера XML или внутри памяти, такими как массивы и списки. Дополнительная информация доступна в библиотеке MSDN: http://msdn.microsoft.com/en-us/library/bb308959.aspx

Я попробую простой ответ: LINQ – это способ запросить вашу базу данных (или другой хранилище данных, XML и т. Д.) С использованием языка запросов, который похож на SQL, но может быть скомпилирован внутри приложения .NET.

LINQ означает Language Integrated Query и является способом обеспечения механизма запросов общего назначения в среде CLR.

На самом базовом уровне это состоит из набора методов для IEnumerable – например, Select, Sum, Where – которые могут использоваться для ограничений, outlookов и т. Д. [1]

Для этого немного LINQ также определяет новую модель поставщика LINQ, которая может принимать дерево выражений и использовать ее для запуска «родных» запросов к источнику данных за пределами CLR – например, LINQ to SQL, LINQ to XML, LINQ в NHibernate и т. д.

C # и VB.NET также определили синтаксис запроса, который позволяет писать строго типизированные запросы inline (который очень похож на SQL), который затем компилятор переводит в эквивалентные вызовы IEnumerable .

Для меня самое интересное в LINQ – все функции C # и VB.NET, которые необходимы для его поддержки, полезны сами по себе. Для поддержки LINQ были необходимы методы расширения, анонимные типы, lambda-выражения и неявное типирование, но мы склонны использовать эти функции за пределами чистого контекста LINQ.

[1] Это реляционные термины, функциональные программисты, вероятно, предпочтут Map, Reduce, Fold и т. Д.

LINQ – это технология для извлечения данных с использованием идиомы, основанной на языке программирования C #. Хотя он во многом обязан функциональному дизайну SQL, он в основном является собственным языком запросов к данным. Он работает в широком спектре источников данных (базы данных SQL, представления в памяти, XML и т. Д.). LINQ-To-SQL, в частности, следует рассматривать как отличие от традиционного использования встроенного SQL, который страдает от того, что часто называют «несоответствием импеданса» между программированием SQL и программированием на C # / VB.

Для обсуждения LINQ и его ограничений вы можете взглянуть на этот связанный вопрос: не LINQ to SQL не хватает точки?

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

«Проект LINQ представляет собой кодовое имя для набора расширений .NET Framework, которые охватывают интегрированные в язык операции запроса, установки и преобразования. Он расширяет C # и Visual Basic с синтаксисом родного языка для запросов и предоставляет библиотеки classов, чтобы воспользоваться преимуществами эти возможности ».

  • Linq-запрос или выражение Lambda?
  • Операция может дестабилизировать время выполнения?
  • Как вернуть анонимный тип из метода c #, который использует LINQ to SQL
  • Буквенно-цифровая сортировка с использованием LINQ
  • Отличный не работает с LINQ to Objects
  • LINQ - Синтаксис запроса против цепей методов и lambda
  • «Лямбда-выражение с телом оператора не может быть преобразовано в дерево выражений»
  • Рекурсивная иерархия - рекурсивный запрос с использованием Linq
  • Выберите выделение, используя linq
  • Используйте LINQ для объединения нескольких строк в одну строку (свойство CSV)
  • Использование IQueryable с Linq
  • Давайте будем гением компьютера.