Синтаксис LINQ
Аббревиатура LINQ обозначает целый набор технологий, создающих и использующих возможности интеграции запросов непосредственно в язык C#. Традиционно запросы к данным выражаются в виде простых строк без проверки типов при компиляции или поддержки IntelliSense. Кроме того, разработчику приходится изучать различные языки запросов для каждого типа источников данных: баз данных SQL, XML-документов, различных веб-служб и т. д. Технологии LINQ превращают запросы в удобную языковую конструкцию, которая применяется аналогично классам, методам и событиям.
Для разработчика, который создает запросы, наиболее очевидной частью LINQ является интегрированное выражение запроса. Выражения запроса используют декларативный синтаксис запроса. С помощью синтаксиса запроса можно выполнять фильтрацию, упорядочение и группирование данных из источника данных, обходясь минимальным объемом программного кода. Одни и те же базовые выражения запроса позволяют одинаково легко получать и преобразовывать данные из баз данных SQL, наборов данных ADO .NET, XML-документов, XML-потоков и коллекций .NET.
В следующем примере показан полный пример использования запроса. Полная операция сначала создает источник данных, затем определяет выражение запроса и выполняет этот запрос в инструкции foreach
.
// Specify the data source.
int[] scores = { 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 + " ");
}
// Output: 97 92 81
Выражение запроса можно использовать для получения и преобразования данных из любого источника данных, поддерживающего LINQ. Например, можно одним запросом получить данные из базы данных SQL и создать на их основе выходной XML-поток.
Выражение запроса очень легко понять, поскольку в нем используется много знакомых конструкций языка C#.
Все переменные в выражениях запросов строго типизированы, хотя во многих случаях вам не нужно указывать тип явным образом, поскольку компилятор определит его автоматически. Дополнительные сведения см. в статье Отношения между типами в операциях запросов LINQ (C#).
Запрос не будет выполняться, пока вы не начнете обращаться к переменной запроса, например, с помощью инструкции
foreach
. Дополнительные сведения см. в статье Введение в запросы LINQ (C#).Во время компиляции выражения запроса преобразуются в вызовы метода стандартного оператора запроса. Для преобразования используются правила, заданные в спецификации C#. Любой запрос, который может быть выражен с помощью синтаксиса запросов, также может быть выражен с помощью синтаксиса методов. Однако в большинстве случаев синтаксис запроса будет понятнее и лаконичнее. Дополнительные сведения см. в статьях C# language specification (Спецификация языка C#) и Общие сведения о стандартных операторах запроса (C#).
Мы рекомендуем при написании запросов LINQ использовать синтаксис запросов везде, где это возможно, а синтаксис метода — только если это совершенно необходимо. Между этими формами синтаксиса нет никакой разницы в семантике или производительности. Выражения запросов обычно более удобочитаемыми, чем аналогичные выражения с использованием синтаксиса метода.
Некоторых операции запросов, например Count или Max, не имеют эквивалентных предложений выражения для запросов и должны выражаться как вызовы методов. Синтаксис запросов и синтаксис методов можно сочетать друг с другом различными способами. Дополнительные сведения см. в статье Синтаксис запросов и синтаксис методов в LINQ (C#).
Выражения запросов могут компилироваться в деревья выражений или в делегаты, в зависимости от типа, к которому применяется конкретный запрос. Запросы IEnumerable<T> компилируются в делегаты. Запросы IQueryable и IQueryable<T> компилируются в деревья выражений. Дополнительные сведения см. в статье Деревья выражений.
Чтобы получить дополнительные сведения о LINQ, сначала ознакомьтесь с некоторыми основным понятиями в статье Основы выражения запроса, а затем переходите к документации по интересующей вас технологии LINQ.
XML-документы: LINQ to XML
Платформа ADO.NET Entity Framework: LINQ to Entities
Коллекции, файлы, строки и другие сущности .NET: LINQ to Objects (C#)
Чтобы глубже разобраться в базовой концепции LINQ изучите статью о LINQ в C#.
Чтобы быстрее приступить к работе с LINQ в C#, переходите к руководству Работа с LINQ.