LINQ — (C#)

Аббревиатура LINQ обозначает целый набор технологий, создающих и использующих возможности интеграции запросов непосредственно в язык C#. Традиционно запросы к данным выражаются в виде простых строк без проверки типов при компиляции или поддержки IntelliSense. Кроме того, разработчику приходится изучать различные языки запросов для каждого типа источников данных: баз данных SQL, XML-документов, различных веб-служб и т. д. Технологии LINQ превращают запросы в удобную языковую конструкцию, которая применяется аналогично классам, методам и событиям. Вы создаете запросы к строго типизированным коллекциям объектов с помощью ключевых слов языка и знакомых операторов. Семейство технологий LINQ обеспечивает согласованное функционирование запросов для объектов (LINQ to Objects), реляционных баз данных (LINQ to SQL) и XML (LINQ to XML).

Для разработчика, который создает запросы, наиболее очевидной частью LINQ является интегрированное выражение запроса. Выражения запроса используют декларативный синтаксис запроса. С помощью синтаксиса запроса можно выполнять фильтрацию, упорядочение и группирование данных из источника данных, обходясь минимальным объемом программного кода. Одни и те же базовые выражения запроса позволяют запрашивать и преобразовывать данные из баз данных SQL, наборов данных ADO.NET, XML-документов, XML-потоков и коллекций .NET.

Вы можете писать запросы LINQ в C# для обращения к базам данных SQL Server, XML-документам, наборам данных ADO.NET и любым коллекциям объектов, поддерживающим интерфейс IEnumerable или универсальный интерфейс IEnumerable<T>. Кроме того, сторонние разработчики обеспечивают поддержку LINQ для множества веб-служб и других реализаций баз данных.

В следующем примере показан полный пример использования запроса. Полная операция сначала создает источник данных, затем определяет выражение запроса и выполняет этот запрос в инструкции 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 к базе данных SQL Server в C# и Visual Basic с полной проверкой типов и поддержкой IntelliSense:

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

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

  • Выражение запроса можно использовать для получения и преобразования данных из любого источника данных, поддерживающего 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.

Чтобы глубже разобраться в базовой концепции LINQ изучите статью о LINQ в C#.

Чтобы быстрее приступить к работе с LINQ в C#, переходите к руководству Работа с LINQ.