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

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

Ответ 1

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

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

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

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

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

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

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

  • 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, С#, IronPython, COBOL.NET и т.д.).


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

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

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

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

    IEnumerable<string> 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<string>
    var names = myCustomers.Select(c => c.Name);
    

Ответ 2

LINQ (запрошенный языком запрос) может ссылаться на:

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

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

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

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

Компоненты могут использоваться изолированно или объединены.

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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