|
Программирование >> Программирование с использованием ajax
Описание полученных результатов Класс Customer и инициализация списка customers - такие же, как в предыдущих примерах. Основной запрос состоит из конструкции from. . .orderby. . . select в синтаксисе запросов, как и те, что создавались ранее в этой главе, но без частей where и orderby. Вы проектируете поля, представляющие интерес, с помощью select, в этом случае - свойства City, Country и Region: var queryResults = from с in customers select new { c.City, c.Country, c.Region } Поскольку операция First () возвращает значение единственного объекта, а не результирующий набор, создавать цикл foreach не нужно; вместо этого результат печатается непосредственно: Console.WriteLine(queryResults.First(с => с.Region == Africa )); Это находит заказчика, и результат City = Lagos, Country = Nigeria, Region = Africa выводится на печать. Затем осуществляется запрос заказчика из Антарктиды с использованием FirstOrDefault (): Console.WriteLine(queryResults.FirstOrDefault(с => с.Region == Antarctica )); Это не находит никакого реального результата, поэтому возвращается null (пустой результат), который выглядит как пустая строка. Что случилось бы, используй вы операцию First () вместо FirstOrDef ault () в таком запросе? В этом случае было бы получено следующее исключение: System.InvalidOperationException: Sequence contains no matching element System. InvalidOperationException: Последовательность не содержит совпадающего элемента Вместо этого FirstOrDef ault () возвращает элемент по умолчанию для списка, если критерий поиска не удовлетворяется ни одной записью, и этим элементом по умолчанию является null для данного анонимного типа. Иначе для региона Антарктиды возникло бы исключение. Код печати результатов и приостановки вывода - такой же, как и в предыдущих примерах, за исключением небольших изменений в экранных сообщениях. Операции с множествами LINQ поддерживает стандартные операции множеств, такие как UnionO и Intersect (), оперирующие результатами запроса. Вы использовали одну из этих операций, когда ранее писали запрос Distinct (). В следующем практическом занятии вы добавите простой список заказов, который прислан гипотетическим заказчиком, и воспользуетесь стандартными операциями множеств для сопоставления заказов с существующими заказчиками. пра1аическое занятие Операции множеств * Выполните следующие шаги для создания примера в Visual С# 2008. 1. Создайте новое консольное приложение по имени 26-15-SetOperators в каталоге C:\BegVCSharp\Chapter26. 2. Скопируйте код создания класса Customer и инициализации списка customers (List<Customer> customers) из примера 2б-7-QueryComplexObjects. 3. После объявления класса Customer добавьте следующий класс Order: class Order { public string ID { get; set; } public decimal Amount { get; set; } 4. В методе Main (), вслед за инициализацией списка customers, создайте и инициализируйте список orders данными, показанными ниже: List<Order> orders = new List<Order> {
5. Вслед за инициализацией списка orders введите такие запросы: var customerlDs = from с in customers select c.ID var orderlDs = from о in orders select o.ID 6. Введите следующий запрос, использующий Intersect (): var customersWithOrders = customerlDs.Intersect(orderlDs); Console.WriteLine( ID заказчиков с заказами: ); foreach (var item in customersWithOrders) Console.Write( Console.WriteLine( item) 7. Затем введите следующий запрос, использующий Except (): Console.WriteLine ( ID заказов без заказчиков: ); var ordersNoCustomers = orderlDs.Except(customerlDs); foreach (var item in ordersNoCustomers) Console.Write( {0} , item); Console.WriteLine(); 8. И, наконец, введите следующий запрос, использующий Union (): Console.WriteLine( Все ID заказчиков и заказов: ); var allCustomerOrderlDs = orderlDs.Union(customerlDs); foreach (var item in allCustomerOrderlDs) { Console.Write( {0} , item); 9. Откомпилируйте и выполните программу. Вы получите такой вывод: ID заказчиков с заказами: Р Q R S Т ID заказов без заказчиков: и V W X Y Z Все ID заказчиков и заказов: PQRSTUVWXYZABCDEFGHIJKLMNO Программа завершена, нажмите Enter для продолжения: Описание полученных результатов Класс Customer и инициализация списка customers - те же, что и в предыдущих примерах. Новый класс Order подобен классу Customer и использует средство автоматических свойств С# 3.0 для объявления общедоступных свойств (ID, Amount): class Order { public string ID { get; set; } public decimal Amount { get; set; } Как и класс Customer, это является упрощенным примером с количеством данных, достаточным для демонстрации запроса. Вы используете два простых запроса from. . .select для получения полей ID из классов Customer и Order, соответственно: var customerlDs = from с in customers select c.ID var orderlDs = from о in orders select o.ID Затем с помощью операции множества Intersect () находятся только ID заказчиков, которые имеют соответствующие заказы в результирующем наборе order IDs. В пересечение включаются только те ID, что появляются в обоих результирующих наборах: var customersWithOrders = customerlDs.Intersect(orderlDs); Операции множеств требуют, чтобы члены множеств имели одинаковый тип, для гарантии ожидаемого результата. Здесь используется преимущество того факта, что ID в обоих типах объектов являются строками и имеют одинаковую семантику (подобно внешним ключам в базе данных). Вывод результатов использует тот факт, что ID представлены одиночным символом, поэтому применяется вызов Console .Write () без WriteLine () до конца цикла foreach, чтобы сделать вывод компактным и четким: Console.WriteLine( ID заказчиков с заказами: ); foreach (var item in customersWithOrders) Console.Write( { 0} , item); Console.WriteLine(); Ту же логику печати вы используете и в остальных циклах foreach.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |