Синтаксис LINQLanguage Integrated Query (LINQ)

Аббревиатура LINQ обозначает целый набор технологий, создающих и использующих возможности интеграции запросов непосредственно в язык C#.Language-Integrated Query (LINQ) is the name for a set of technologies based on the integration of query capabilities directly into the C# language. Традиционно запросы к данным выражаются в виде простых строк без проверки типов при компиляции или поддержки IntelliSense.Traditionally, queries against data are expressed as simple strings without type checking at compile time or IntelliSense support. Кроме того, разработчику приходится изучать различные языки запросов для каждого типа источников данных: баз данных SQL, XML-документов, различных веб-служб и т. д.Furthermore, you have to learn a different query language for each type of data source: SQL databases, XML documents, various Web services, and so on. Технологии LINQ превращают запросы в удобную языковую конструкцию, которая применяется аналогично классам, методам и событиям.With LINQ, a query is a first-class language construct, just like classes, methods, events. Вы создаете запросы к строго типизированным коллекциям объектов с помощью ключевых слов языка и знакомых операторов.You write queries against strongly typed collections of objects by using language keywords and familiar operators. Семейство технологий LINQ обеспечивает согласованное функционирование запросов для объектов (LINQ to Objects), реляционных баз данных (LINQ to SQL) и XML (LINQ to XML).The LINQ family of technologies provides a consistent query experience for objects (LINQ to Objects), relational databases (LINQ to SQL), and XML (LINQ to XML).

Для разработчика, который создает запросы, наиболее очевидной частью LINQ является интегрированное выражение запроса.For a developer who writes queries, the most visible "language-integrated" part of LINQ is the query expression. Выражения запроса используют декларативный синтаксис запроса.Query expressions are written in a declarative query syntax. С помощью синтаксиса запроса можно выполнять фильтрацию, упорядочение и группирование данных из источника данных, обходясь минимальным объемом программного кода.By using query syntax, you can perform filtering, ordering, and grouping operations on data sources with a minimum of code. Одни и те же базовые выражения запроса позволяют одинаково легко получать и преобразовывать данные из баз данных SQL, наборов данных ADO .NET, XML-документов, XML-потоков и коллекций .NET.You use the same basic query expression patterns to query and transform data in SQL databases, ADO .NET Datasets, XML documents and streams, and .NET collections.

Вы можете писать запросы LINQ в C# для обращения к базам данных SQL Server, XML-документам, наборам данных ADO.NET и любым коллекциям объектов, поддерживающим интерфейс IEnumerable или универсальный интерфейс IEnumerable<T>.You can write LINQ queries in C# for SQL Server databases, XML documents, ADO.NET Datasets, and any collection of objects that supports IEnumerable or the generic IEnumerable<T> interface. Кроме того, сторонние разработчики обеспечивают поддержку LINQ для множества веб-служб и других реализаций баз данных.LINQ support is also provided by third parties for many Web services and other database implementations.

В следующем примере показан полный пример использования запроса.The following example shows the complete query operation. Полная операция сначала создает источник данных, затем определяет выражение запроса и выполняет этот запрос в инструкции foreach.The complete operation includes creating a data source, defining the query expression, and executing the query in a foreach statement.

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 к базе данных SQL Server в C# и Visual Basic с полной проверкой типов и поддержкой IntelliSense:The following illustration from Visual Studio shows a partially-completed LINQ query against a SQL Server database in both C# and Visual Basic with full type checking and IntelliSense support:

Схема, показывающая запрос LINQ с Intellisense.

Описание выражения запросаQuery expression overview

  • Выражение запроса можно использовать для получения и преобразования данных из любого источника данных, поддерживающего LINQ.Query expressions can be used to query and to transform data from any LINQ-enabled data source. Например, можно одним запросом получить данные из базы данных SQL и создать на их основе выходной XML-поток.For example, a single query can retrieve data from a SQL database, and produce an XML stream as output.

  • Выражение запроса очень легко освоить, поскольку в нем используется много знакомых конструкций языка C#.Query expressions are easy to master because they use many familiar C# language constructs.

  • Все переменные в выражениях запросов строго типизированы, хотя во многих случаях вам не нужно указывать тип явным образом, поскольку компилятор определит его автоматически.The variables in a query expression are all strongly typed, although in many cases you do not have to provide the type explicitly because the compiler can infer it. Дополнительные сведения см. в статье Type relationships in LINQ query operations (Взаимодействие типов в операциях запроса LINQ).For more information, see Type relationships in LINQ query operations.

  • Запрос не будет выполняться, пока вы не начнете обращаться к переменной запроса, например, с помощью инструкции foreach.A query is not executed until you iterate over the query variable, for example, in a foreach statement. Дополнительные сведения см. в статье Introduction to LINQ queries (Введение в запросы LINQ).For more information, see Introduction to LINQ queries.

  • Во время компиляции выражения запроса преобразуются в вызовы метода стандартного оператора запроса. Для преобразования используются правила, заданные в спецификации C#.At compile time, query expressions are converted to Standard Query Operator method calls according to the rules set forth in the C# specification. Любой запрос, который может быть выражен с помощью синтаксиса запросов, также может быть выражен с помощью синтаксиса методов.Any query that can be expressed by using query syntax can also be expressed by using method syntax. Однако в большинстве случаев синтаксис запроса будет понятнее и лаконичнее.However, in most cases query syntax is more readable and concise. Дополнительные сведения см. в статьях C# language specification (Спецификация языка C#) и Standard query operators overview (Общие сведения о стандартных операторах запроса).For more information, see C# language specification and Standard query operators overview.

  • Мы рекомендуем при написании запросов LINQ использовать синтаксис запросов везде, где это возможно, а синтаксис метода — только если это совершенно необходимо.As a rule when you write LINQ queries, we recommend that you use query syntax whenever possible and method syntax whenever necessary. Между этими формами синтаксиса нет никакой разницы в семантике или производительности.There is no semantic or performance difference between the two different forms. Выражения запросов обычно более удобочитаемыми, чем аналогичные выражения с использованием синтаксиса метода.Query expressions are often more readable than equivalent expressions written in method syntax.

  • Некоторых операции запросов, например Count или Max, не имеют эквивалентных предложений выражения для запросов и должны выражаться как вызовы методов.Some query operations, such as Count or Max, have no equivalent query expression clause and must therefore be expressed as a method call. Синтаксис запросов и синтаксис методов можно сочетать друг с другом различными способами.Method syntax can be combined with query syntax in various ways. Дополнительные сведения см. в статье Query syntax and method syntax in LINQ (Синтаксис запросов и синтаксис методов в LINQ).For more information, see Query syntax and method syntax in LINQ.

  • Выражения запросов могут компилироваться в деревья выражений или в делегаты, в зависимости от типа, к которому применяется конкретный запрос.Query expressions can be compiled to expression trees or to delegates, depending on the type that the query is applied to. Запросы IEnumerable<T> компилируются в делегаты.IEnumerable<T> queries are compiled to delegates. Запросы IQueryable и IQueryable<T> компилируются в деревья выражений.IQueryable and IQueryable<T> queries are compiled to expression trees. Дополнительные сведения см. в статье Expression trees (Деревья выражений).For more information, see Expression trees.

Следующие шагиNext steps

Чтобы получить дополнительные сведения о LINQ, сначала ознакомьтесь с некоторыми основным понятиями в статье Query expression basics (Базовая информация о выражении запроса), а затем переходите к документации по интересующей вас технологии LINQ.To learn more details about LINQ, start by becoming familiar with some basic concepts in Query expression basics, and then read the documentation for the LINQ technology in which you are interested:

Чтобы глубже разобраться в базовой концепции LINQ изучите статью о LINQ в C#.To gain a deeper understanding of LINQ in general, see LINQ in C#.

Чтобы быстрее приступить к работе с LINQ в C#, переходите к руководству Working with LINQ (Работа с LINQ).To start working with LINQ in C#, see the tutorial Working with LINQ.

См. такжеSee also