Запрос может состоять из нескольких операторов fгom
от, которые оказываются в этом случае вложенными. Такие операторы from
находят применение в тех случаях, когда по запросу требуется получить данные из двух разных источников. Рассмотрим простой пример, в котором два вложенных оператора from
используются в запросе для циклического обращения к элементам двух разных массивов символов. В итоге по такому запросу формируется последовательность результатов, содержащая все возможные комбинации двух наборов символов.
// Использовать два вложенных оператора from для составления списка
// всех возможных сочетаний букв А, В и С с буквами X, Y и Z.
using System;
using System.Linq;
// Этот класс содержит результат запроса,
class ChrPair {
public char First;
public char Second;
public ChrPair(char c, char c2) {
First = c;
Second = c2;
}
}
class MultipleFroms {
static void Main() {
char[] chrs = { 'A', 'В', 'C' };
char[] chrs2 = { 'X', 'Y', 'Z' };
// В первом операторе from организуется циклическое обращение
//к массиву символов chrs, а во втором операторе from —
// циклическое обращение к массиву символов chrs2.
var pairs = from ch1 in chrs
from ch2 in chrs2
select new ChrPair(ch1, ch2);
Console.WriteLine("Все сочетания букв ABC и XYZ: ");
foreach(var p in pairs)
Console.WriteLine("{0} {1}", p.First, p.Second);
}
}
Выполнение этого кода приводит к следующему результату.
Все сочетания букв ABC и XYZ:
А X
A Y
A Z
В X
В Y
В Z
С X
С Y
С Z
Этот пример кода начинается с создания класса ChrPair
, в котором содержатся результаты запроса. Затем в нем создаются два массива, chrs
и chrs2
, и, наконец, формируется следующий запрос для получения всех возможных комбинаций двух последовательностей результатов.
var pairs = from ch1 in chrs
from ch2 in chrs2
select new ChrPair(ch1, ch2);
Во вложенных операторах from
организуется циклическое обращение к обоим массивам символов, chrs
и chrs2
. Сначала из массива chrs
получается символ, сохраняемый в переменной ch1
. Затем перечисляется содержимое массива chrs2
. На каждом шаге циклического обращения во внутреннем операторе from
символ из массива chrs2
сохраняется в переменной ch2
и далее выполняется оператор select
. В результате выполнения оператора select
создается новый объект типа ChrPair
, содержащий пару символов, которые сохраняются в переменных ch1
и ch2
на каждом шаге циклического обращения к массиву во внутреннем операторе from
. А в конечном итоге получается объект типа ChrPair
, содержащий все возможные сочетания извлекаемых символов.
Вложенные операторы from
применяются также для циклического обращения к источнику данных, который содержится в другом источнике данных. Соответствующий пример приведен в разделе "Применение оператора let для создания временной переменной в запросе" далее в этой главе.
Группирование результатов с помощью оператора group
Одним из самых эффективных средств формирования запроса является оператор group
, поскольку он позволяет группировать полученные результаты по ключам. Используя последовательность сгруппированных результатов, можно без особого труда получить доступ ко всем данным, связанным с ключом. Благодаря этому свойству оператора group
доступ к данным, организованным в последовательности связанных элементов, осуществляется просто и эффективно. Оператор group
является одним из двух операторов, которыми может оканчиваться запрос. (Вторым оператором, завершающим запрос, является select
.) Ниже приведена общая форма оператора group.
group переменная_диапазона by ключ
Этот оператор возвращает данные, сгруппированные в последовательности, причем каждую последовательность обозначает общий