Основные операции запросов LINQ (C#)
В этом разделе содержится краткое описание выражений запроса LINQ и некоторые типичные операции, выполняемые в запросе.Более подробные сведения находятся в следующих разделах:
Выражения запросов LINQ (Руководство по программированию на C#)
Общие сведения о стандартных операторах запроса
Пошаговое руководство. Написание запросов на C# (LINQ)
Примечание |
---|
Если вы уже знакомы с языком запросов, таким как 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#).
Примечание |
---|
Для неуниверсальных источников данных, таких как 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.
// 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 всегда работает с коллекциями объектов, а не непосредственно с таблицами базы данных.
var innerJoinQuery =
from cust in customers
join dist in distributors on cust.City equals dist.City
select new { CustomerName = cust.Name, DistributorName = dist.Name };
В LINQ нет необходимости использовать join так часто, как в SQL, поскольку внешние ключи в LINQ представлены в объектной модели свойствами, содержащими коллекцию элементов.Например, объект Customer содержит коллекцию объектов Order.Вместо выполнения соединения, доступ к заказам можно получить с помощью точечной нотации.
from order in Customer.Orders...
Дополнительные сведения см. в разделе Предложение join (Справочник по C#).
Выбор (Проецирование)
Предложение select создает результаты запроса и задает форму или тип каждого возвращаемого элемента.Например, можно указать, будут ли результаты состоять из полных объектов Customer, только из одного члена, подмножества членов или некоторых совершенно других типов, на основе вычислений или создания новых объектов.Когда предложение select создает что-либо отличное от копии исходного элемента, операция называется проекцией.Использование проекций для преобразования данных является мощной возможностью выражений запросов LINQ.Дополнительные сведения см. в разделах Преобразования данных с помощью LINQ (C#) и Предложение "select" (справочник по C#).
См. также
Задачи
Пошаговое руководство. Написание запросов на C# (LINQ)
Ссылки
Анонимные типы (Руководство по программированию в C#)
Основные понятия
Выражения запросов LINQ (Руководство по программированию на C#)
Основные операции запроса (Visual Basic)