Language Integrated Query (Language Integrated Query)

Перейти к навигации Перейти к поиску
LINQ в составе .NET Framework

Language Integrated Query (LINQ) — проект Microsoft по добавлению синтаксиса языка запросов, напоминающего SQL, в языки программирования платформы .NET Framework. Ранее был реализован в языках C# и Visual Basic .NET. Множество концепций, которые вводит LINQ, изначально опробовали в исследовательском проекте Microsoft .

LINQ выпущен вместе с Visual Studio 2008 в конце ноября 2007 года. Для быстрого создания и отладки запросов LINQ существует специализированная утилита LINQPad.

Особенности языка

[править | править код]

Используя некоторые новые особенности языка, LINQ позволяет использовать SQL-подобный синтаксис непосредственно в коде программы, написанной, например, на языке C#:

Источники данных

[править | править код]

Изначально поддерживая механизм запросов для коллекций объектов в памяти, реляционных баз данных и данных в формате XML, LINQ обладает расширяемой архитектурой, которая позволяет сторонним разработчикам реализовать доступ к своим хранилищам данных через механизм LINQ. Для этого необходимо реализовать стандартные операторы запросов, используя методы расширения, или реализовать интерфейс IQueryable, позволяющий разбирать дерево выражения во время выполнения, транслируя его в свой язык запросов. В сообществе существует пример пользовательской реализации стандартных операторов запросов.[1]

Например, LINQ для SQL (бывший DLinq), который преобразует LINQ-выражения в SQL-запросы к базе данных, использует возможности компилятора для построения дерева выражений, основываясь на контексте программы, а не создавая делегаты функций. Получив дерево выражения, описывающее запрос, специализированный провайдер базы данных может его проанализировать и преобразовать в запрос на подходящем языке для базы данных, например Microsoft SQL Server, Jet (которая используется в Microsoft Access) или любой другой. Некоторые энтузиасты при помощи подобной тактики уже создали для проверки концепции LINQ библиотеки для запросов к WMI[2], RSS, LDAP[3], коллекциям данных ADO.NET, Amazon Web Services[4] и SharePoint[5].

Существующая предварительная версия от Microsoft также включает в себя реализацию LINQ для XML (ранее называвшуюся XLinq), которая значительно упрощает построение XML-документа и извлечение данных из него, используя похожие подходы. Кроме того, Microsoft работает над ADO.NET vNext, также известным как LINQ to Entities.

LINQ по типам источников данных

[править | править код]

В конце 2008 года ответственность за разработку LINQ к SQL наряду с ADO.NET Entity Framework (в том числе и LINQ к Entities) была переложена на команду, занимавшуюся развитием ADO.NET (т. н. ADO.NET team), тогда как ранее развитием LINQ к SQL занималась команда, связанная с разработкой компилятора для языка C#[6]. Таким образом, стало очевидно, что оба решения нацелены на решение одних и тех же задач, а следовательно будут конкурировать друг с другом. Немного позднее Тим Маллалью разъяснил, что Microsoft продолжит разработку LINQ к SQL на основе пользовательских отзывов. Однако, начиная с версии платформы .NET 4.0, рекомендованным решением становится именно LINQ к Entities. Кроме того, на основании информации, полученной от пользователей, наиболее употребляемые возможности LINQ к SQL будут добавлены и в LINQ к Entities[7]. В результате чего произойдет постепенное слияние решений.

Эксперты в основном поддержали данное решение. Так, например, Марко Руссо хотя и оговорился, что переходить к LINQ к Entities стоит не раньше, чем оно превратится в полноценную замену LINQ к SQL, тем не менее заявил, что объединение двух частично перекрывающих друг друга фреймворков — хорошая идея, но при этом не должны пострадать те пользователи, которые привыкли пользоваться «отбрасываемыми» частями решений[6].

LINQ к объектам

[править | править код]

Представляет собой не что иное, как функциональное программирование, замаскированное под синтаксис SQL[8].

Библиотека LINQ включает в себя инструмент SQLMetal, который позволяет автоматически генерировать классы непосредственно из поддерживаемых .NET Framework баз данных, что дает возможность очень быстро и просто интегрировать в код сущности базы данных. Альтернативой является входящий в состав Visual Studio реляционный конструктор объектов, однако он может быть использован только вместе с Microsoft SQL Server.

// тип Northwind — это наследник DataContext, созданный SQLMetal
// тип Northwind.Orders — Table<Order>
// тип Northwind.Customers — Table<Customer>

Northwind db = new Northwind(connectionString);

// используется ключевое слово 'var', так как не существует имени у типа,
// к которому принадлежит результат запроса

var q = from o in db.Orders from c in db.Customers
    where o.Quality == "200" && (o.CustomerID == c.CustomerID)
    select new { o.DueDate, c.CompanyName, c.ItemID, c.ItemName };

// q ссылается на объект типа IEnumerable<T>, где T — анонимный тип,
// генерируемый компилятором

foreach (var t in q)
{
    // t является строго типизированным, хоть у его типа и отсутствует имя,
    // известное при написании кода

    Console.WriteLine("DueDate Type = {0}", t.DueDate.GetType());
    Console.WriteLine("CompanyName (lowercased) = {0}", t.CompanyName.ToLower());
    Console.WriteLine("ItemID * 2 = {0}", t.ItemID * 2);
}

Примечания

[править | править код]
  1. A custom implementation of the .NET Standard Query Operators from LINQ. Дата обращения: 21 июня 2007. Архивировано 29 сентября 2007 года.
  2. Query your WMI with ease using WMILinq! — Mielz' Thingamajig. Дата обращения: 21 июня 2007. Архивировано из оригинала 10 апреля 2007 года.
  3. The IQueryable tales — LINQ to LDAP — Part 0: Introduction — B# .NET Blog. Дата обращения: 21 июня 2007. Архивировано из оригинала 30 июня 2007 года.
  4. Introducing Linq to Amazon — Fabrice’s weblog. Дата обращения: 21 июня 2007. Архивировано 30 июня 2007 года.
  5. LINQ to SharePoint. Дата обращения: 21 июня 2007. Архивировано 12 августа 2007 года.
  6. 1 2 LINQ to SQL vs LINQ to Entities — decisions from ADO.NET team Архивировано 24 января 2011 года.  (англ.)
  7. Clarifying the message on L2S Futures Архивная копия от 30 июня 2011 на Wayback Machine  (англ.)
  8. LINQ как шаг к функциональному программированию (Чистяков Влад, RSDN Magazine #2-2008). Дата обращения: 14 сентября 2016. Архивировано 19 сентября 2016 года.

Литература

[править | править код]
  • Адам Фримен, Джозеф C. Раттц-мл. LINQ: язык интегрированных запросов в C# 2010 для профессионалов = Pro LINQ: Language Integrated Query in C# 2010. — М.: «Вильямс», 2011. — С. 656. — ISBN 978-5-8459-1701-0.