Академический Документы
Профессиональный Документы
Культура Документы
Тип источника
данных
Имя
файла
БД
}
Рис. Вывод взаимосвязанных данных
Можно расширить использование связей, добавив третий объект для таблицы Order
Details (рис. )
Рис. Три взаимосвязанных объекта в проекте
Теперь мы хотим посчитать суммы заказов. Для этого, не меняя запрос и внешний цикл
вывода информации о заказчике, добавим во внутренний цикл вывод суммы произведений
количества на стоимость единицы
listBox2.Items.Clear();
foreach (var item in queryResults)
{listBox2.Items.Add("Заказчик: "+item.Name+" Страна: "+item.Country+
" Город: "+item.City+" заказов:"+Convert.ToString(item.Orders.Count));
listBox2.Items.Add("ID закаэа Дата заказа Общая сумма");
foreach (Order o in item.Orders)
listBox2.Items.Add(Convert.ToString(o.OrderID) + " " + Convert.ToString(o.OrderDate)+" "+
Convert.ToString(o.Order_Details.Sum(od => od.Quantity * od.UnitPrice))); }}
Для получения суммы по всем строкам заказа применяется агрегатная операция LINQ
Sum(), которой передается лямбда-выражение:
od => od.Quantity * od.UnitPrice),
вычисляющее общую сумму каждого заказа.
Операции group и огderby в LINQ to SQL те же, что и в LINQ to Objects, но использование
источников данных SQL для каждого LINQ может опираться на возможности group и
orderby самой базы данных SQL, в зависимости от способа построения запроса.
Для получения суммы продаж по странаи следует записать три запроса: первый выдает
название страны и сумму продаж. Операция Sum(), использующая лямбда-выражение od
=> od. Quantity * od.UnitPrice
Используется для получения суммы всех единиц заказов.
Второй запрос группирует данные по странам, используя результаты предыдущего
запроса в качестве источника данных.
Этот запрос использует страну в качестве ключа для группировки результатов и
суммирования общих продаж (в данном случае Sum() суммирует общие продажи по всем
заказчикам в пределах страны), и операция вложена внутрь другого вызова Sum () для
суммирования продаж по всем заказам для каждого заказчикаr.
В последнем запросе данные упорядочиваются по суммам.
DataClasses1DataContext northWindDataContext=newDataClasses1DataContext();
var totalResults =
from c 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 c in totalResults
group c by c.Country into eg
select new { TotalSales = eg.Sum(c => c.Sales), Country = eg.Key };
var orderedResults =
from eg in groupResults
orderby eg.Country descending
select eg;
listBox2.Items.Clear();
foreach (var item in orderedResults)
{ listBox2.Items.Add(item.Country+" "+Convert.ToString(item.TotalSales)); }
Каждый запрос (переменная типа var) генерирует оператор языка SQL, который
посылается базе данных.
Аналогично выбирается второй объект Object. После этого окно Data Source примет вид
(рис. )
Рис. Окно Data Source
Создадим на форме поле для ввода города и кнопку для вывода данных – результатов
запроса.
Код, выполняемый при нажатии кнопки:
DataClasses1DataContext northWindDataContext = new DataClasses1DataContext();
string param = textBox1.Text;
// Переменная для результатов, возвращаемых хранимой процедурой
var custquery = northWindDataContext.Customers_By_City(param);
// Выполнение хранимой процедуры
listBox1.Items.Clear();
foreach (var custOrdersDetail in custquery)
{listBox1.Items.Add(custOrdersDetail.CompanyName); }
param = "";
textBox1.Text = "";