Выражения запросов LINQ (Руководство по программированию на C#)
LINQ (Language-Integrated Query) — это название набора технологий, основанных на интеграции возможностей запроса непосредственно в язык C# (а также в Visual Basic и, возможно, в любые другие языки .NET). Благодаря LINQ запрос теперь является одним из основных структурных элементов языка, подобно классам, методам, событиям и т. д.
Для разработчиков, сознающих запросы, наиболее очевидная "встроенная в язык" часть LINQ — это выражение запросов. Выражения запросов составляются в соответствии с декларативным синтаксисом запроса, который был впервые предложен в C# 3.0. Синтаксис запроса позволяет выполнять достаточно сложную фильтрацию, упорядочение и операции группирования при работе с источниками данных, используя минимум программного кода. Можно использовать одинаковые базовые шаблоны запросов для запроса и преобразования данных в базах данных SQL, наборах данных ADO.NET, документах и потоках XML, а также в коллекциях .NET.
В следующем примере показана выполненная операция запроса. Для выполнения операции запроса требуется создать источник данных, определить выражение запроса и выполнить запрос в операторе foreach.
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 + " ");
}
}
}
// Output: 97 92 81
Дополнительные сведения об основах LINQ в C# см. в разделе Приступая к работе с LINQ в C#.
Общие сведения о выражениях запросов
Выражения запросов можно использовать для запроса и преобразования данных, полученных из любого источника данных, поддерживающего LINQ. Например, один и тот же запрос может извлекать данные из базы данных SQL и на выходе создавать поток XML.
Выражения запросов достаточно легко изучить, поскольку они во многом схожи с элементами языка C#. Дополнительные сведения см. в разделе Приступая к работе с LINQ в C#.
Все переменные в выражении запросов имеют строгую типизацию, хотя во многих случаях не требуется явным образом указывать тип, поскольку компилятор его вычисляет. Дополнительные сведения см. в разделе Отношения между типами в операциях запросов LINQ (C#).
Выполнение запроса не происходит до использования переменной запроса в операторе foreach. Дополнительные сведения см. в разделе Введение в запросы LINQ (C#).
При компиляции выражения запросов преобразуется в вызовы методов стандартных операторов запроса согласно правилам, указанным в спецификациях языка C#. Любой запрос, которые может быть выражен с помощью синтаксиса запросов, также может быть выражен с помощью синтаксиса методов. Однако синтаксис запросов в большинстве случаев понятнее и лаконичнее. Дополнительные сведения см. в разделах Спецификация языка C# и Общие сведения о стандартных операторах запроса.
При создании запросов LINQ рекомендуется использовать синтаксис запросов везде, где это возможно, и синтаксис методов, если это необходимо. Между этими двумя видами не существует различий ни в семантике, ни в производительности. Выражения запросов просто более понятны, чем соответствующие им выражения, написанные с помощью синтаксиса методов.
Для некоторых операций запросов, таких как Count иди Max, нет соответствующих предложений в выражениях запросов, поэтому их необходимо создавать с помощью вызова методов. Синтаксис запросов и синтаксиса методов можно сочетать друг с другом различными способами. Дополнительные сведения см. в разделе Сравнение синтаксиса запросов LINQ и синтаксиса методов (C#).
В зависимости от типа, к которому применяется запрос, выражения запросов можно компилировать в деревья выражений или в делегаты. Запросы IEnumerable<T> компилируются в делегаты. Запросы IQueryable и IQueryable<T> компилируются в деревья выражений. Дополнительные сведения см. в разделе Деревья выражений (C# и Visual Basic).
В следующей таблице перечислены разделы, содержащие дополнительные сведения запросах и примеры кода для распространенных задач.
Раздел |
Описание |
---|---|
Основы выражения запроса (Руководство по программированию в C#) |
Описание основных принципов работы запросов, примеры синтаксиса запросов C#. |
Практическое руководство. Создание запросов LINQ на языке C# |
Примеры нескольких базовых типов выражений запросов. |
Как и когда перемещать код, в котором могут возникнуть исключения, за пределы выражений запросов. |
|
Практическое руководство. Заполнение коллекций объектов из нескольких источников (LINQ) |
Как использовать оператор select для слияния данных из разных источников в новый тип. |
Практическое руководство. Группировка результатов запросов (Руководство по программированию на C#) |
Различные способы использования предложения group. |
Практическое руководство. Создание вложенной группы (Руководство по программированию на C#) |
Демонстрация создания вложенных групп. |
Демонстрация использования вложенных выражений в запросе в качестве источника данных для нового запроса. |
|
Показано, как реализовать потокобезопасный стандартный оператор запроса, который может выполнять операции группирования на потоковых источниках данных. |
|
Демонстрация предоставления произвольного числа значений для сравнения равенства в предложении where. |
|
Демонстрация материализации и хранения результатов запросов без обязательного использования цикла foreach. |
|
Практическое руководство. Возврат запроса из метода (Руководство по программированию на C#) |
Демонстрация возврата переменных запросов из методов и передачи их методам в качестве входных параметров. |
Демонстрация операций соединения на основе функций предикатов любых видов. |
|
Демонстрация соединения двух источников на основе нескольких совпадающих ключей. |
|
Демонстрация упорядочения последовательности, созданной в результате операции соединения. |
|
Практическое руководство. Выполнение внутренних соединений (Руководство по программированию на C#) |
Демонстрация выполнения внутреннего соединения в LINQ. |
Практическое руководство. Выполнение групповых соединений (Руководство по программированию на C#) |
Демонстрация выполнения группового соединения в LINQ. |
Демонстрация выполнения левого внешнего соединения в LINQ. |
|
Демонстрация обработки значений null в запросах LINQ. |
См. также
Задачи
Пошаговое руководство. Написание запросов на C# (LINQ)
Основные понятия
Руководство по программированию на C#
Основные операции запросов LINQ (C#)
Сравнение синтаксиса запросов LINQ и синтаксиса методов (C#)
Общие сведения о стандартных операторах запроса
Другие ресурсы
Ключевые слова запроса (Справочник по C#)