Программирование >>  Программирование с использованием ajax 

1 ... 275 276 277 [ 278 ] 279 280 281 ... 396


Затем с помощью операции Except () находятся ID заказов, которые не имеют соответствующего заказчика:

Console.WriteLine ( ID заказов без заказчиков: );

var ordersNoCustomers = orderlDs.Except(customerlDs);

И, наконец, посредством операции Union () получается объединение всех полей ID заказчиков с полями ID заказов:

Console.WriteLine( Все ID заказчиков и заказов: ); var allCustomerOrderlDs = orderlDs.Union(customerlDs);

Обратите внимание, что ID выводятся в том же порядке, в каком они появляются в списках заказчиков и заказов, с исключением дубликатов.

Код приостановки вывода на экран такой же, как и в предыдущих примерах.

Операции множеств удобны, хотя практическая польза от их применения ограничена требованием, чтобы все объекты, которыми они манипулируют, относились к одному и тому же типу. Эти операции удобны в определенных узких ситуациях, когда нужно манипулировать наборами одинаково типизированных результатов, но в наиболее типичном случае, когда необходимо работать с разными связанными типами объектов, понадобится более практичный механизм работы с разными типами, такой как оператор соединения join.

Соединения

Наборы данных, подобные спискам customers и orders, которые были только что созданы с общим ключевым полем (ID) позволяют использовать запрос join, посредством которого можно запросить взаимосвязанные данные из обоих списков в единственном запросе, объединяя их по значению ключевого поля. Это подобно оператору JOIN в языке SQL. Как и можно было ожидать, LINQ предоставляет команду join в синтаксисе запросов, которой вы воспользуетесь в следующем практическом занятии.

г]укгмческоезц Получение соединения

Выполните следующие шаги для создания примера в Visual С# 2008.

1. Создайте новое консольное приложение по имени 26-16-JoinQuery в каталоге С:\BegVCSharp\Chapter2 6.

2. Скопируйте создание классов Customer и Order, а также инициализации списков customers (List<Cistomer> customers)и orders (List<Order> orders) из предыдущего примера; этот код здесь точно такой же.

3. В методе Main () вслед за инициализацией списков customers и orders введите следующий запрос:

var queryResults =

from с in customers

join о in orders on c.ID equals o.ID

select new { c.ID, c.City, SalesBefore = c.Sales, NewOrder = ©.Amount,

SalesAfter = с.Sales+o.Amount };

4. Завершите программу стандартным циклом обработки запроса foreach, который применялся в предыдущих примерах:



foreach (var item in queryResults) {

Console.WriteLine(item);

5. Откомпилируйте и выполните программу. Вы получите следующий вывод:

{ ID = Р, City = Tehran, SalesBefore = 7000, NewOrder = 100, SalesAfter = 7100 } { ID = Q, City = London, SalesBefore = 8000, NewOrder = 200, SalesAfter = 8200 } { ID = R, City = Beijing, SalesBefore = 9000, NewOrder = 300, SalesAfter = 9300 } { ID = S, City = Bogot б , SalesBefore = 1001, NewOrder = 400, SalesAfter = 1401 } { ID = T, City = Lima, SalesBefore = 2002, NewOrder = 500, SalesAfter = 2502 } Программа завершена, нажмите Enter для продолжения:

Описание полученных результатов

Код объявления и инициализации класса Customer и класса Order, а также списков customers и orders - такой же, как и в предыдущем примере.

В запросе ключевое слово join служит для соединения каждого заказчика с соответствующими ему заказами, используя поле ID из классов Customer и Order, соответственно:

var queryResults =

from с in customers

join о in orders on c.ID equals o.ID

Ключевое слово on следует за именем поля ключа (ID), а ключевое слово equals указывает на соответствующее поле в другой коллекции. Результат запроса включает только данные объектов, имеющих то же значение поля ID, что и соответствующее поле ID в другой коллекции.

Оператор select проектирует новый тип данных со свойствами, названными так, что вы можете ясно видеть исходную сумму продаж, новый заказ и результирующую новую сумму:

select new { c.ID, c.City, SalesBefore = с.Sales, NewOrder = o.Amount,

SalesAfter = с . Sales+o.Amount };

Хотя вы не увеличиваете объем продаж в объекте customer этой программы, это делается легко.

Логика цикла foreach и отображение значений, возвращенных запросом, в точности такие же, как и в предыдущих программах настоящей главы.

Ресурсы для дополнительного изучения

Методов LINQ, доступных при использовании синтаксиса методов, слишком много, чтобы охватить их все в книге для начинающих. Дополнительные детали примеров ищите в онлайновой документации Microsoft по LINQ. Краткие примеры каждого метода LINQ вы найдете в разделе 101 LINQ Samples в справочной системе MSDN (или по адресу http: msdn2 .microsoft. com/en-us/vcsharp/aa336746. aspx).

Руководство, составленное Эриком Вайтом (Eric White) по функциональному программированию на http: blogs.msdn.com/ericwhite/pages/FP-Tutorial.aspx является хорошим источником информации на эту тему в контексте LINQ. Также оно представляет краткое руководство по синтаксису методов LINQ.



Резюме

В этой главе рассмотрены следующие вопросы.

□ Различные вариации LINQ, включая LINQ to Objects, LINQ to SQL и LINQ to XML.

□ Как кодировать запросы LINQ для LINQ to Objects и части операторов запросов LINQ, включая конструкции from, where, select и orderby.

□ Как использовать цикл foreach для выполнения итерации по результатам запроса LINQ и как отложить выполнение запроса до запуска оператора foreach.

□ LINQ построен на базе концепции расширяющих методов. Вы узнали, как использовать синтаксис методов и лямбда-выражения.

□ Как использовать агрегатные операции LINQ для получения информации о крупных наборах данных, не выполняя итерации по каждому элементу результата.

□ Как использовать проекцию для изменения типов данных и создания новых объектов в запросах.

□ Как использовать операции Distinct (), Any (), All (), First (), FirstOrDefault (), TakeO и Skip().

□ Групповые запросы и упорядочивание на нескольких уровнях.

□ Операции множеств и соединения.

Как вы убедились, LINQ делает запросы, написанные на родном С#, довольно легкими и мощными. В следующей главе вы узнаете, как использовать LINQ to SQL для запросов реляционных баз данных и эффективной работы с наборами данных.

Упражнения

Модифицируйте программу из первого примера (2 6-1-FirstLINQquery) для упорядочивания результатов в убывающем порядке.

Модифицируйте число, переданное методу generateLotsOfNumbers () в примере с большими числами (2 6-5-LargeNumberQuery), для создания результирующих наборов разного размера и посмотрите, как это повлияет на результаты запроса.

Добавьте конструкцию orderby к запросу в примере с большими числами (2б-5-LargeNumberQuery), чтобы увидеть, как это влияет на производительность.

Модифицируйте условия запроса в примере программы с большими числами (26-5-LargeNumberQuery) для выбора больших и меньших подмножеств списка чисел. Как это влияет на производительность?

Модифицируйте пример синтаксиса методов (26-2-LINQMethodSyntax), чтобы полностью исключить конструкцию where. Насколько объемный вывод он сгенерирует?

Модифицируйте пример программы запроса сложных объектов (26-7-Query ComplexObjects) для выбора другого подмножества полей запроса с условием, соответствующим этим полям.

Добавьте агрегатные операции к программе из первого примера (26-1-First LINQquery). Какие простые агрегатные операции доступны для нечисловых результирующих наборов?



1 ... 275 276 277 [ 278 ] 279 280 281 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика