Книга: C# 4.0: полное руководство

Продолжение запроса с помощью оператора into

Продолжение запроса с помощью оператора into

При использовании в запросе оператора select или group иногда требуется сформировать временный результат, который будет служить продолжением запроса для получения окончательного результата. Такое продолжение осуществляется с помощью оператора into в комбинации с оператором select или group. Ниже приведена общая форма оператора into:

into имя тело_запроса

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

-------------------------------

ПРИМЕЧАНИЕ

Существует также форма оператора into, предназначенная для использования вместе с оператором join, создающим групповое объединение, о котором речь пойдет далее в этой главе.

-------------------------------

Ниже приведен пример программы, в которой оператор into используется вместе с оператором group. Эта программа является переработанным вариантом предыдущего примера, в котором список веб-сайтов формируется по имени домена самого верхнего уровня. А в данном примере первоначальные результаты запроса сохраняются в переменной диапазона ws и затем отбираются для исключения всех групп, состоящих менее чем из трех элементов.

// Использовать оператор into вместе с оператором group.
using System;
using System.Linq;
class IntoDemo {
  static void Main() {
    string[] websites = { "hsNameA.com", "hsNameB.net",
      "hsNameC.net", "hsNameD.com", "hsNameE.org", "hsNameF.org",
      "hsNameG.tv", "hsNameH.net", "hsNamel.tv"
    };
    // Сформировать запрос на получение списка
    // веб-сайтов, группируемых
    //по имени домена самого верхнего уровня, но выбрать только те
    // группы, которые состоят более чем из двух членов.
    // Здесь ws — это переменная диапазона для ряда групп,
    // возвращаемых при выполнении первой половины запроса,
    var webAddrs = from addr in websites
         where addr.LastIndexOf('.') != -1
         group addr by addr.Substring(addr.LastIndexOf('.'))
         into ws where ws.Count() > 2 select ws;
    // Выполнить запрос и вывести его результаты.
    Console.WriteLine("Домены самого верхнего уровня " +
             "с более чем двумя членами.");
    foreach(var sites in webAddrs) {
      Console.WriteLine("Содержимое домена: " + sites.Key);
      foreach(var site in sites)
        Console.WriteLine ("    "    +    site);
      Console.WriteLine();
    }
  }
}

Эта программа дает следующий результат:

Домены самого верхнего уровня с более чем двумя членами.
Содержимое домена: .net
hsNameB.net
hsNameC.net
hsNameH.net

Как следует из результата выполнения приведенной выше программы, по запросу возвращается только группа .net, поскольку это единственная группа, содержащая больше двух элементов.

Обратите особое внимание в данном примере программы на следующую последовательность операторов в формируемом запросе.

group addr by addr.Substring(addr.LastIndexOf('.'))
into ws where ws.Count() > 2 select ws;

Сначала результаты выполнения оператора group сохраняются как временные для последующей обработки оператором where. В качестве переменной диапазона в данный момент служит переменная ws. Она охватывает все группы, возвращаемые оператором group. Затем результаты запроса отбираются в операторе where с таким расчетом, чтобы в конечном итоге остались только те группы, которые содержат больше двух членов. Для этой цели вызывается метод Count(), который является методом расширения и реализуется для всех объектов типа IEnumerable. Он возвращает количество элементов в последовательности. (Подробнее о методах расширения речь пойдет далее в этой главе.) А получающаяся в итоге последовательность групп возвращается оператором select.

Оглавление книги


Генерация: 1.294. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз