Страница 316 из 502
<b>// Продемонстрировать применение оператора join.</b>
<b>using System;</b>
<b>using System.Linq;</b>
<b>// Класс, связывающий наименование товара с его порядковым номером,</b>
<b>class Item {</b>
<b> public string Name { get; set; }</b>
<b> public int ItemNumber { get; set; }</b>
<b> public Item(string n, int inum) {</b>
<b> Name = n;</b>
<b> ItemNumber = inum;</b>
<b> }</b>
<b>}</b>
<b>// Класс, связывающий наименование товара</b>
<b>// с состоянием его запасов на складе,</b>
<b>class InStockStatus {</b>
<b> public int ItemNumber { get; set; }</b>
<b> public bool InStock { get; set; }</b>
<b> public InStockStatus (int n, bool b) {</b>
<b> ItemNumber = n;</b>
<b> InStock = b;</b>
<b> }</b>
<b>}</b>
<b>// Класс, инкапсулирующий наименование товара и</b>
<b>// состояние его запасов на складе,</b>
<b>class Temp {</b>
<b> public string Name { get; set; }</b>
<b> public bool InStock { get; set; }</b>
<b> public Temp(string n, bool b) {</b>
<b> Name = n;</b>
<b> InStock = b;</b>
<b> }</b>
<b>}</b>
<b>class JoinDemo {</b>
<b> static void Main() {</b>
<b> Item[] items = {</b>
<b> new Item("Кусачки", 1424), new Item("Тиски", 7892),</b>
<b> new Item("Молоток", 8534), new Item("Пила", 6411)</b>
<b> };</b>
<b> InStockStatus[] statusList = {</b>
<b> new InStockStatus(1424, true),</b>
<b> new InStockStatus(7892, false),</b>
<b> new InStockStatus(8534, true),</b>
<b> new InStockStatus(6411, true)</b>
<b> };</b>
<b> // Сформировать запрос, объединяющий объекты классов Item</b>
<b> //и InStockStatus для составления списка наименований товаров</b>
<b> // и их наличия на складе. Обратите внимание на формирование</b>
<b> // последовательности объектов класса Temp,</b>
<b> var inStockList = from item in items</b>
<b> join entry in statusList</b>
<b> on item.ItemNumber equals entry.ItemNumber</b>
<b> select new Temp(item.Name, entry.InStock);</b>
<b> Console.WriteLine("ТоварtНаличиеn");</b>
<b> // Выполнить запрос и вывести его результаты.</b>
<b> foreach(Temp t in inStockList)</b>
<b> Console.WriteLine("{0}t{1}", t.Name, t.InStock);</b>
<b> }</b>
<b>}</b>
Эта программа дает следующий результат
<b>Товар Наличие</b>
<b>Кусачки True</b>
<b>Тиски False</b>
<b>Молоток True</b>
<b>Пила True</b>
Для того чтобы стал понятнее принцип действия оператора join, рассмотрим каждую строку запроса из приведенной выше программы по порядку. Этот запрос начинается, как обычно, со следующего оператора from.
<b>var inStockList = from item in items</b>
В этом операторе указывается переменная диапазона item для источника данных items, который представляет собой массив объектов класса Item. В классе Item инкапсулируются наименование товара и порядковый номер товара, хранящегося на складе.
Далее следует приведенный ниже оператор join.
<b>join entry in statusList</b>
<b> on item.ItemNumber equals entry.ItemNumber</b>
В этом операторе указывается переменная диапазона entry для источника данных statusList, который представляет собой массив объектов класса InStockStatus, связывающего порядковый номер товара с состоянием его запасов на складе. Следовательно, у массивов items и statusList имеется общее свойство: порядковый номер товара. Именно это свойство используется в части on/equals оператора join для описания связи, по которой из двух разных источников данных выбираются наименования товаров, когда их порядковые номера совпадают.