Language Integrated Query | это... Что такое Language Integrated Query? (original) (raw)

LINQ в составе .NET Framework

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

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

Содержание

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

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

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

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

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

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

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

LINQ к SQL

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

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

SQLMetal

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

Пример

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

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 — анонимный тип, // генерируемый компилятором

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. LINQ как шаг к функциональному программированию (Чистяков Влад, RSDN Magazine #2-2008)
  2. A custom implementation of the .NET Standard Query Operators from LINQ
  3. Query your WMI with ease using WMILinq! — Mielz' Thingamajig
  4. The IQueryable tales — LINQ to LDAP — Part 0: Introduction — B# .NET Blog
  5. Introducing Linq to Amazon — Fabrice’s weblog
  6. LINQ to SharePoint
  7. 1 2 LINQ to SQL vs LINQ to Entities — decisions from ADO.NET team (англ.)
  8. Clarifying the message on L2S Futures (англ.)

Литература

Ссылки

Просмотр этого шаблона .NET Framework
Архитектура Base Class LibraryCommon Language Infrastructure.NET assemblyметаданныеCOM Interop
Инфраструктура Common Language RuntimeCommon Type SystemCommon Intermediate Language • Virtual Execution System • Dynamic Language Runtime
Языки Microsoft C#Visual Basic .NETC++/CLI (Managed) • Visual J#JScript .NETWindows PowerShellIronPythonIronRubyF#Spec#Sing#
Другие языки A#Boo • IronLisp • L# • NemerleP#PascalABC.NETPHPScalaCobra • Delphi Prism
Windows Foundations PresentationCommunicationWorkflow
Компоненты ADO.NET (Entity Framework · Data Services) · ASP.NET (AJAX · MVC · Dynamic Data) · .NET Remoting · Language Integrated Query · Windows CardSpace · Windows Forms · XAML · ClickOnce · Dynamic Language Runtime · Parallel FX Library (PLINQ · TPL)
Реализации DotGNUMono.NET Compact Framework (Xbox 360) • .NET Micro FrameworkPortable.NETXNA FrameworkSilverlight • Shared Source Common Language Infrastructure
Сравнения C# и Java • C# и Visual Basic .NET
Будущие технологии Acropolis • Jasper