LINQ - Обзор
Разработчики во всем мире всегда сталкивались с проблемами при запросе данных из-за отсутствия определенного пути и необходимости владеть множеством технологий, таких как 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. Это следующие.
Синтаксис Lamda (Method)
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 в 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 было важно изучить 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.