Что такое LINQ и для чего он нужен? [закрыто]

126

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

Kredns
источник
20
Я считаю, что я победил критерий «невозможно дать разумный ответ». Нет причин закрывать этот вопрос.
Amy B
1
Послушайте создателя LINQ Эрика Мейера, скажите, что это такое. Кстати, это не только для базы данных.
Sнаđошƒаӽ

Ответы:

171

LINQ расшифровывается как Language Integrated Query .

Вместо того, чтобы писать YAQL (еще один язык запросов), разработчики языков Microsoft предоставили способ выражать запросы непосредственно на своих языках (таких как C # и 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, созданная командой 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. Все это транслируется в методы в System.Linq.Queryable или System.Linq.Enumerable (в зависимости от типа myCustomers). Это совершенно необязательно, и вы можете хорошо использовать LINQ и без него. Одним из преимуществ этого стиля объявления запроса является то, что переменные диапазона имеют ограниченную область видимости: их не нужно повторно объявлять для каждого предложения.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
  • Лямбда-выражения - это сокращение для указания метода. Компилятор C # переведет каждый из них либо в анонимный метод, либо в истинный 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);
Эми Б
источник
14

LINQ (Language INtegrated Query) может относиться к:

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

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

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

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

Компоненты можно использовать по отдельности или вместе.

Джеффри Хантин
источник
10

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

Воислав Стойкович
источник
это точно и кратко.
SSD
6

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

jcollum
источник
1
Так в чем же разница между Linq и SQL?
Kredns
Я думаю, что для этого есть более сложное название, но структуры различаются: SQL - это Select From Where, а LINQ - From Where Select. LINQ проще использовать в цикле. LINQ просто проще :) и SQL, который он создает, обычно достаточно хорош, учитывая экономию времени.
jcollum
2
честно говоря, можно утверждать, что SQL должен быть написан как From Where Select, etc.- то есть он должен быть написан так, как фактически формируется набор результатов
Don Cheadle
6

LINQ расшифровывается как Language Integrated Query и представляет собой способ предоставления механизма «запросов» общего назначения в CLR.

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

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

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

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

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

Марк Брэкетт
источник
5

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

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

Марк Бриттингем
источник
0

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

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

Jobo
источник
Так это для баз данных? То, что я видел здесь (в SO), больше похоже на коллекции в среде .net.
OscarRyz