Выражения запросов LINQ (Руководство по программированию на C#)

LINQ — это название набора технологий, основанных на интеграции возможностей запроса непосредственно в язык 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``1 иди Max, нет соответствующих предложений в выражениях запросов, поэтому их необходимо создавать с помощью вызова методов. Синтаксис запросов и синтаксиса методов можно сочетать друг с другом различными способами. Дополнительные сведения см. в разделе Синтаксис запросов и синтаксис методов в LINQ (C#).

  • В зависимости от типа, к которому применяется запрос, выражения запросов можно компилировать в деревья выражений или в делегаты. Запросы IEnumerable компилируются в делегаты. Запросы IQueryable и IQueryable компилируются в деревья выражений. Дополнительные сведения см. в разделе Деревья выражений (C# и Visual Basic).

В следующей таблице перечислены разделы, содержащие дополнительные сведения запросах и примеры кода для распространенных задач.

Раздел

Описание

Основы выражения запроса (Руководство по программированию в C#)

Описание основных принципов работы запросов, примеры синтаксиса запросов C#.

Практическое руководство. Создание запросов LINQ на языке C#

Примеры нескольких базовых типов выражений запросов.

Практическое руководство. Обработка исключений в выражениях запросов (Руководство по программированию на C#)

Как и когда перемещать код, в котором могут возникнуть исключения, за пределы выражений запросов.

Практическое руководство. Заполнение коллекций объектов из нескольких источников (LINQ)

Как использовать оператор select для слияния данных из разных источников в новый тип.

Практическое руководство. Группировка результатов запросов (Руководство по программированию на C#)

Различные способы использования предложения group.

Практическое руководство. Создание вложенной группы (Руководство по программированию на C#)

Демонстрация создания вложенных групп.

Практическое руководство. Вложенный запрос в операции группирования (Руководство по программированию на C#)

Демонстрация использования вложенных выражений в запросе в качестве источника данных для нового запроса.

Практическое руководство. Группирование результатов по смежным ключам (Руководство по программированию в C#)

Показано, как реализовать потокобезопасный стандартный оператор запроса, который может выполнять операции группирования на потоковых источниках данных.

Практическое руководство. Динамическое определение фильтров предикатов во время выполнения (Руководство по программированию на C#)

Демонстрация предоставления произвольного числа значений для сравнения равенства в предложении where.

Практическое руководство. Сохранение результатов запроса в памяти (Руководство по программированию в C#)

Демонстрация материализации и хранения результатов запросов без обязательного использования цикла foreach.

Практическое руководство. Возврат запроса из метода (Руководство по программированию на C#)

Демонстрация возврата переменных запросов из методов и передачи их методам в качестве входных параметров.

Практическое руководство. Выполнение пользовательских операций соединения (Руководство по программированию на C#)

Демонстрация операций соединения на основе функций предикатов любых видов.

Практическое руководство. Соединение с помощью составных ключей (Руководство по программированию в C#)

Демонстрация соединения двух источников на основе нескольких совпадающих ключей.

Практическое руководство. Упорядочение результатов предложения соединения (Руководство по программированию на C#)

Демонстрация упорядочения последовательности, созданной в результате операции соединения.

Практическое руководство. Выполнение внутренних соединений (Руководство по программированию на C#)

Демонстрация выполнения внутреннего соединения в LINQ.

Практическое руководство. Выполнение групповых соединений (Руководство по программированию на C#)

Демонстрация выполнения группового соединения в LINQ.

Практическое руководство. Выполнение левых внешних соединений (Руководство по программированию на C#)

Демонстрация выполнения левого внешнего соединения в LINQ.

Практическое руководство. Обработка значений NULL в выражениях запросов (Руководство по программированию в C#)

Демонстрация обработки значений null в запросах LINQ.

См. также

Задачи

Пошаговое руководство. Написание запросов на C# (LINQ)

Основные понятия

Руководство по программированию на C#

Основные операции запросов LINQ (C#)

Синтаксис запросов и синтаксис методов в LINQ (C#)

Общие сведения о стандартных операторах запроса

Другие ресурсы

LINQ

Ключевые слова запроса (Справочник по C#)

How Linq to Objects Queries Work

Reading and Writing Queries

What is a collection?

Link to Everything: A List of LINQ Providers