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

1 ... 281 282 283 [ 284 ] 285 286 287 ... 396


I* iM fi 0iu In* pup

j , J CuM*mt<u em <0*.r


Puc. 27.16. Перетаскивание таблицы Order Details

4. Модифицируйте конструкцию foreach для печати результатов запроса:

foreach (var item in queryResults) {

Console.WriteLine(

Заказчик: {0} {!}, {2}\n{3} заказов:\tID 3aKa3a\tflaTa 3aKa3a\t06maH сумма item.Name, item.City, item.State, item.Orders.Count); foreach (Order о in item.Orders) { Console.WriteLine(

\t{0,10}\t{l,10}\t{2,10} , O.OrderlD,

o.OrderDate.Value.ToShortDateString 0 , o.Order Details.Sum(od = > od.Quantity * od.UnitPrice) .ToString( C2 ));

Console.WriteLine( Для продолжения нажмите Enter ... ); Console.ReadLine ();

5. Откомпилируйте и выполните программу (вы можете просто нажать F5 для запуска Start Debugging). Опять же, результат, показанный здесь, составляет только часть вывода:

Заказчик: Trails Head Gourmet Provisioners Kirkland, WA 3 заказов: ID заказа Дата заказа Обшая сумма

10574 6/19/1997 $764.30

10577 6/23/1997 $569.00

10822 1/8/1998 $237.90

Заказчик: White Clover Markets Seattle, WA

14 заказов:

ID заказа 10269 10344 10469 10483 10504 10596 10693

Дата заказа 7/31/1996 11/1/1996 3/10/1997 3/24/1997 4/11/1997 7/11/1997 10/6/1997

Общая сумма

$676.00 $2,856.00 $1,125.50 $704.00 $1,388.50 $1,476.10 $2,334.00



10696

10/8/1997

$996.

10723

10/30/1997

$468.

10740

11/13/1997

$1,770.

10861

1/30/1998

$3,523.

10904

2/24/1998

$1,924,

11032

4/17/1998

$8,902.

11066

5/1/1998

$928.75

Для продолжения нажмите Enter Как и ранее, нажмите <Enter> для завершения программы и закрытия окна консоли.

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

Вы модифицировали предыдущую программу вместо создания новой с нуля, так что повторять все шаги по созданию исходного файла отображения LINQ to SQL Northwind.dbml не потребуется.

В результате перетаскивания таблицы Order Details из окна Database Explorer добавился класс OrderDetail к исходному файлу Northwind. dbml, а также член-коллекция OrderDetails к классу Order для представления отношения между таблицами Orders и Order Details.

Поскольку имена классов и имена их членов в С# не могут содержать пробелы, 0/R Designer вставляет подчеркивания, формируя имена Order Detail и Order Details.

Подобно члену Orders самого класса Customer, член Order Details класса Orders является EntitySet, представляющим отношение.

Модифицировать конструкции from. . .where. . .select предыдущего запроса LINQ вообще не потребовалось; вместо этого все изменения коснулись цикла обработки foreach:

Console.WriteLine( Заказчик: {0} {1}, {2}\n{3} заказов:\tID заказаМДата зaкaзa\tOбщaя сумма item.Name, item.City, item.State, item.Orders.Count); foreach (Order о in item.Orders) { Console.WriteLine(

\t{0,10}\t{l,10}\t{2,10} , O.OrderlD,

O.OrderDate.Value.ToShortDateString(), o.Order Details.Sum(od = > od.Quantity * od.UnitPrice) .ToString( C2 ));

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

Во внутреннем цикле foreach улучшено форматирование каждого вхождения за счет добавления ширины поля 10 для каждого места заполнения Console .WriteLine (), так что оно читается, как \t{0,10}\t{l, 10}\t{2,10} .

В списке полей были переданы Order ID и OrderDate, сформатированные в виде короткой строки даты, чтобы исключить ненужную часть, описывающую время в OrderDate. Итог по каждому заказу вычисляется по OrderDetails. Все элементы вы уже видели в предыдущей главе.

Для получения суммы по всем строкам заказа применяется агрегатная операция LINQ Sum О, которой передается лямбда-выражение (od => od.Quantity * od.UnitPrice), вычисляющее общую сумму каждого заказа (промежуточным итогом каждой детали заказа является количество единиц цены. Вы форматируете этот итог в виде денежной величины с двумя десятичными разрядами ( С2 ), и на этом пример завершается.



Группировка, упорядочивание и другие расширенные запросы в LINQ to SQL

Теперь, когда вы знаете общие затраты каждого заказчика, можно приступить к выяснению вопросов более высокого уровня. Какие заказчики приобрели больше всего продуктов? В каких регионах или странах они находятся? Какие продукты продаются лучше всего? Чтобы ответить на подобные вопросы, поддерживающие принятие решений, потребуется группировка и упорядочивание. Операции group и orderby в коде LINQ to SQL те же, что и в LINQ to Objects, но использование источников данных SQL для каждого LINQ может опираться на возможности group и orderby самой базы данных SQL, в зависимости от способа построения запроса. В следующем примере вы попробуете это, конструируя запрос для нахождения стран, в которых были наибольшие объемы продаж.

упорядочивание и другие расширенные запросы

Модифицируйте в Visual С# 2008 проект предыдущего примера BegVCSharp 27 l FirstLINQtoSQLQuery в каталоге C:\BegVCSharp\Chapter27, как описано в следующих шагах.

1. Откройте главный файл Program, cs. Замените запрос LINQ в методе Main () следующими запросами:

static void Main(string [ ] args) (

NorthwindDataContext northWindDataContext = new NorthwindDataContext(); var totalResults =

from с in northWindDataContext.Customers

select new

Country = c.Country, Sales = c.Orders.Sum(o = > o.Order Details.Sum(od = > od.Quantity * od.UnitPrice)

var groupResults =

from с in totalResults group с by c.Country into eg

select new { TotalSales = cg.Sum(c = > c.Sales), Country = eg.Key }

var orderedResults =

from eg in groupResults

orderby eg.TotalSales descending

select eg

2. Продолжите модификацию метода Main () в Program, cs заменой цикла foreach, следующего за запросом LINQ, таким кодом:

Console.WriteLine ( CTpaHa\t\tBeero продаж\п--------\t------------ ) ;

foreach (var item in orderedResults) {

Console.WriteLine( {0,-15}{1,12} ,

item.Country, item.TotalSales.ToString ( C2 ));



1 ... 281 282 283 [ 284 ] 285 286 287 ... 396

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