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

Обновлен: Ноябрь 2007

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

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

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

Bb397927.alert_note(ru-ru,VS.90).gifПримечание.

Если вы уже знакомы с языком запросов, таким как SQL или XQuery, можно пропустить большую часть этого раздела. Чтобы изучить порядок предложений в выражениях запроса LINQ, прочитайте о предложении from в следующем разделе.

Получение источника данных

В первую очередь в запросе LINQ нужно указать источник данных. В C#, как и в большинстве языков программирования, переменная должна быть объявлена до ее использования. В запросе LINQ первым идет предложение from для указания источника данных (customers) и переменная диапазона (cust).

//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
                        select cust;

Переменная диапазона схожа с переменной итерации в цикле foreach за исключением того, что в выражении запроса не происходит фактической итерации. При выполнении запроса переменная диапазона будет использоваться как ссылка на каждый последующий элемент в customers. Поскольку компилятор может определить тип cust, нет необходимости указывать его в явном виде. Дополнительные переменные диапазона могут быть введены предложением let. Дополнительные сведения см. в разделе Предложение let (справочник по C#).

Bb397927.alert_note(ru-ru,VS.90).gifПримечание.

Для неуниверсальных источников данных, таких как ArrayList,переменная диапазона должна быть явно типизирована. Дополнительные сведения см. в разделах Практическое руководство. Выполнение запроса к ArrayList с помощью LINQ и Предложение from (справочник по C#).

Фильтрация

Возможно, наиболее распространенной операцией запроса является применение фильтра в виде логического выражения. Фильтр приводит к возвращению запросом только тех элементов, для которых выражение является истинным. Результат создается с помощью предложения where. Фильтр фактически указывает элементы для исключения из исходной последовательности. В следующем примере возвращаются только customers, находящиеся в Лондоне.

var queryLondonCustomers = from cust in customers
                           where cust.City == "London"
                           select cust;

Для применения нужного числа выражений фильтра в предложении where можно использовать знакомые логические операторы C# AND и OR. Например, для получения только заказчиков из Лондона AND с именем Devon следует написать следующий код.

where cust.City=="London" && cust.Name == "Devon"

Для получения заказчиков из Лондона или Парижа следует написать следующий код.

where cust.City == "London" || cust.City == "Paris"

Дополнительные сведения см. в разделе Предложение where (Справочник по C#).

Упорядочение

Часто целесообразно отсортировать возвращенные данные. Предложение orderby сортирует элементы возвращаемой последовательности в зависимости от компаратора по умолчанию для сортируемого типа. Например, следующий запрос может быть расширен для сортировки результатов на основе свойства Name. Поскольку Name является строкой, сравнение по умолчанию выполняется в алфавитном порядке от А до Я.

var queryLondonCustomers3 = 
    from cust in customers
    where cust.City == "London"
    orderby cust.Name ascending
    select cust;

Для упорядочения результатов в обратном порядке от Я до А используется предложение orderby…descending.

Дополнительные сведения см. в разделе Предложение orderby (Справочник по C#).

Группировка

Предложение group позволяет группировать результаты на основе указанного ключа. Например, можно указать, что результаты должны быть сгруппированы по City так, чтобы все заказчики из Лондона или Парижа оказались в отдельных группах. В этом случае ключом является cust.City.

Bb397927.alert_note(ru-ru,VS.90).gifПримечание.

Для демонстрации данного принципа в следующих примерах используются явные типы. Также можно использовать неявную типизацию для custQuery, group и customer, позволяя компилятору определить точный тип.

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
  var queryCustomersByCity =
      from cust in customers
      group cust by cust.City;

  // customerGroup is an IGrouping<string, Customer>
  foreach (var customerGroup in queryCustomersByCity)
  {
      Console.WriteLine(customerGroup.Key);
      foreach (Customer customer in customerGroup)
      {
          Console.WriteLine("    {0}", customer.Name);
      }
  }

Когда запрос завершается предложением group, результаты представляются в виде списка из списков. Каждый элемент в списке является объектом, имеющим член Key и список элементов, сгруппированных по этому ключу. При итерации запроса, создающего последовательность групп, необходимо использовать вложенный цикл foreach. Внешний цикл выполняет итерацию каждой группы, а внутренний цикл — итерацию членов каждой группы.

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

// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;

Дополнительные сведения см. в разделе Предложение group (Справочник по C#).

Соединение

Операции соединения создают связи между последовательностями, неявно смоделированными в источниках данных. Например, можно выполнить соединение для поиска всех заказчиков в Лондоне, заказавших продукты у поставщиков в Париже. В LINQ предложение join всегда работает с коллекциями объектов, а не непосредственно с таблицами базы данных. В LINQ нет необходимости использовать join так часто, как в SQL, так как внешние ключи в LINQ представлены в объектной модели свойствами, содержащими коллекцию элементов. Например, объект Customer содержит коллекцию объектов Order. Вместо выполнения соединения, доступ к заказам можно получить с помощью точечной нотации.

from order in Customer.Orders...

Дополнительные сведения см. в разделе Предложение join (Справочник по C#).

Выбор (Проецирование)

Предложение select создает результаты запроса и задает форму или тип каждого возвращаемого элемента. Например, можно указать, будут ли результаты состоять из полных объектов Customer, только из одного члена, подмножества членов или некоторых совершенно других типов, на основе вычислений или создания новых объектов. Когда предложение select создает что-либо отличное от копии исходного элемента, операция называется проекцией. Использование проекций для преобразования данных является мощной возможностью выражений запросов LINQ. Дополнительные сведения см. в разделах Преобразования данных с LINQ и Предложение "select" (справочник по C#).

См. также

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

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

Ссылки

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

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

Приступая к работе с LINQ в C#

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