Выражения запросов LINQ (Руководство по программированию на C#)
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 компилируются в делегаты. Запросы IQueryable и IQueryableкомпилируются в деревья выражений. Дополнительные сведения см. в разделе Деревья выражений (C# и Visual Basic).
В следующей таблице перечислены разделы, содержащие дополнительные сведения запросах и примеры кода для распространенных задач.
Раздел |
Описание |
---|---|
Основы выражения запроса (Руководство по программированию в C#) |
Описание основных принципов работы запросов, примеры синтаксиса запросов C#. |
Практическое руководство. Создание запросов LINQ на языке C# |
Примеры нескольких базовых типов выражений запросов. |
Как и когда перемещать код, в котором могут возникнуть исключения, за пределы выражений запросов. |
|
Практическое руководство. Заполнение коллекций объектов из нескольких источников (LINQ) |
Как использовать оператор select для слияния данных из разных источников в новый тип. |
Практическое руководство. Группировка результатов запросов (Руководство по программированию на C#) |
Различные способы использования предложения group. |
Практическое руководство. Создание вложенной группы (Руководство по программированию на C#) |
Демонстрация создания вложенных групп. |
Демонстрация использования вложенных выражений в запросе в качестве источника данных для нового запроса. |
|
Показано, как реализовать потокобезопасный стандартный оператор запроса, который может выполнять операции группирования на потоковых источниках данных. |
|
Демонстрация предоставления произвольного числа значений для сравнения равенства в предложении where. |
|
Демонстрация материализации и хранения результатов запросов без обязательного использования цикла foreach. |
|
Практическое руководство. Возврат запроса из метода (Руководство по программированию на C#) |
Демонстрация возврата переменных запросов из методов и передачи их методам в качестве входных параметров. |
Демонстрация операций соединения на основе функций предикатов любых видов. |
|
Демонстрация соединения двух источников на основе нескольких совпадающих ключей. |
|
Демонстрация упорядочения последовательности, созданной в результате операции соединения. |
|
Практическое руководство. Выполнение внутренних соединений (Руководство по программированию на C#) |
Демонстрация выполнения внутреннего соединения в LINQ. |
Практическое руководство. Выполнение групповых соединений (Руководство по программированию на C#) |
Демонстрация выполнения группового соединения в LINQ. |
Демонстрация выполнения левого внешнего соединения в LINQ. |
|
Демонстрация обработки значений null в запросах LINQ. |