Разработчики во всем мире всегда сталкивались с проблемами при запросе данных из-за отсутствия определенного пути и необходимости освоить множество технологий, таких как SQL, веб-службы, XQuery и т. Д.
Представленный в Visual Studio 2008 и разработанный Андерсом Хейлсбергом, LINQ (Language Integrated Query) позволяет писать запросы даже без знания языков запросов, таких как SQL, XML и т. Д. Запросы LINQ могут быть написаны для различных типов данных.
Пример запроса LINQ
C #
using System; using System.Linq; class Program { static void Main() { string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"}; //Get only short words var shortWords = from word in words where word.Length <= 5 select word; //Print each word out foreach (var word in shortWords) { Console.WriteLine(word); } Console.ReadLine(); } }
VB
Module Module1 Sub Main() Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"} ' Get only short words Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word ' Print each word out. For Each word In shortWords Console.WriteLine(word) Next Console.ReadLine() End Sub End Module
Когда вышеуказанный код C # или VB компилируется и выполняется, он дает следующий результат —
hello LINQ world
Синтаксис LINQ
Существует два синтаксиса LINQ. Это следующие.
Ламда (Метод) Синтаксис
var longWords = words.Where( w ⇒ w.length > 10); Dim longWords = words.Where(Function(w) w.length > 10)
Синтаксис запроса (понимания)
var longwords = from w in words where w.length > 10; Dim longwords = from w in words where w.length > 10
Типы LINQ
Типы LINQ кратко упомянуты ниже.
- LINQ to Objects
- LINQ to XML (XLINQ)
- LINQ to DataSet
- LINQ to SQL (DLINQ)
- LINQ to Entities
Помимо вышесказанного, существует также тип LINQ с именем PLINQ, который является параллельным LINQ от Microsoft.
Архитектура LINQ в .NET
LINQ имеет трехуровневую архитектуру, в которой самый верхний уровень состоит из языковых расширений, а нижний уровень состоит из источников данных, которые обычно являются объектами, реализующими универсальные интерфейсы IEnumerable <T> или IQueryable <T>. Архитектура показана ниже.
Выражения запроса
Выражение запроса — это не что иное, как запрос LINQ, выраженный в форме, аналогичной SQL-запросу, с такими операторами запроса, как Select, Where и OrderBy. Выражения запроса обычно начинаются с ключевого слова «От».
Чтобы получить доступ к стандартным операторам запросов LINQ, пространство имен System.Query должно быть импортировано по умолчанию. Эти выражения написаны в синтаксисе декларативного запроса, который был C # 3.0.
Ниже приведен пример, демонстрирующий полную операцию запроса, которая состоит из создания источника данных, определения выражения запроса и его выполнения.
C #
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Operators { class LINQQueryExpressions { static void Main() { // Specify the data source. int[] scores = new int[] { 97, 92, 81, 60 }; // Define the query expression. IEnumerable<int> scoreQuery = from score in scores where score > 80 select score; // Execute the query. foreach (int i in scoreQuery) { Console.Write(i + " "); } Console.ReadLine(); } } }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
97 92 81
Методы расширения
Представленные в .NET 3.5, методы расширений объявляются только в статических классах и позволяют включать пользовательские методы в объекты для выполнения некоторых точных операций запроса для расширения класса, не являясь действительным членом этого класса. Они также могут быть перегружены.
В двух словах, методы расширения используются для перевода выражений запросов в вызовы традиционных методов (объектно-ориентированные).
Разница между LINQ и хранимой процедурой
Существует множество различий между LINQ и Хранимыми процедурами. Эти различия упомянуты ниже.
-
Хранимые процедуры намного быстрее, чем запрос LINQ, поскольку они следуют ожидаемому плану выполнения.
-
Во время выполнения запроса LINQ легко избежать ошибок во время выполнения, чем в сравнении с хранимой процедурой, поскольку первая поддерживает Intellisense в Visual Studio, а также проверку полного типа во время компиляции.
-
LINQ позволяет выполнять отладку, используя отладчик .NET, что не относится к хранимым процедурам.
-
LINQ предлагает поддержку нескольких баз данных в отличие от хранимых процедур, где важно переписать код для разных типов баз данных.
-
Развертывание решения на основе LINQ легко и просто по сравнению с развертыванием набора хранимых процедур.
Хранимые процедуры намного быстрее, чем запрос LINQ, поскольку они следуют ожидаемому плану выполнения.
Во время выполнения запроса LINQ легко избежать ошибок во время выполнения, чем в сравнении с хранимой процедурой, поскольку первая поддерживает Intellisense в Visual Studio, а также проверку полного типа во время компиляции.
LINQ позволяет выполнять отладку, используя отладчик .NET, что не относится к хранимым процедурам.
LINQ предлагает поддержку нескольких баз данных в отличие от хранимых процедур, где важно переписать код для разных типов баз данных.
Развертывание решения на основе LINQ легко и просто по сравнению с развертыванием набора хранимых процедур.
Нужно для LINQ
До LINQ было важно изучить C #, SQL и различные API, которые связывают их вместе, чтобы сформировать законченное приложение. Поскольку эти источники данных и языки программирования сталкиваются с несоответствием импеданса; чувствуется необходимость в коротком кодировании.
Ниже приведен пример того, как много разных методов было использовано разработчиками при запросе данных до появления LINQ.
SqlConnection sqlConnection = new SqlConnection(connectString); SqlConnection.Open(); System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = sqlConnection; sqlCommand.CommandText = "Select * from Customer"; return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)
Интересно, что из представленных строк кода запрос определяется только двумя последними. Используя LINQ, тот же запрос данных может быть записан в удобочитаемой цветовой кодировке, как, например, следующий, упомянутый ниже, тоже за очень короткое время.
Northwind db = new Northwind(@"C:\Data\Northwnd.mdf"); var query = from c in db.Customers select c;
Преимущества LINQ
LINQ предлагает множество преимуществ, и среди них главное — это его мощная выразительность, которая позволяет разработчикам выражать декларативно. Некоторые из других преимуществ LINQ приведены ниже.
LINQ предлагает подсветку синтаксиса, которая оказывается полезной для выявления ошибок во время разработки.
LINQ предлагает IntelliSense, что означает, что вы можете легко писать более точные запросы.
Написание кодов в LINQ происходит намного быстрее, поэтому время разработки также значительно сокращается.
LINQ упрощает отладку благодаря интеграции с языком C #.
С LINQ легко просматривать отношения между двумя таблицами благодаря своей иерархической функции, которая позволяет составлять запросы, объединяющие несколько таблиц, за меньшее время.
LINQ позволяет использовать единый синтаксис LINQ при запросе множества различных источников данных, и это главным образом из-за его универсального основания.
LINQ является расширяемым, что означает, что можно использовать знания LINQ для запросов новых типов источников данных.
LINQ предлагает возможность объединить несколько источников данных в один запрос, а также разбить сложные проблемы на набор коротких запросов, которые легко отлаживать.
LINQ предлагает простое преобразование для преобразования одного типа данных в другой, например, преобразование данных SQL в данные XML.