Объединение двух последовательностей с помощью оператора join
Когда приходится иметь дело с базами данных, то зачастую требуется формировать последовательность, увязывающую данные из разных источников. Например, в Интернет-магазине может быть организована одна база данных, связывающая наименование товара с его порядковым номером, и другая база данных, связывающая порядковый номер товара с состоянием его запасов на складе. В подобной ситуации может возникнуть потребность составить список, в котором состояние запасов товаров на складе отображается по их наименованию, а не порядковому номеру. Для этой цели придется каким-то образом "увязать" данные из двух разных источников (баз данных). И это нетрудно сделать с помощью такого средства LINQ, как оператор join.
Ниже приведена общая форма оператора join (совместно с оператором from).
From переменная_диапазона_А in источник_данных_А
Join переменная_диапазона_В in источник_данных_В
On переменная_диапазона_А.свойство equals переменная_диапазона_В.свойство
Применяя оператор join, следует иметь в виду, что каждый источник должен содержать общие данные, которые можно сравнивать. Поэтому в приведенной выше форме этого оператора источник_данных_А и источник_данных_В должны иметь нечто общее, что подлежит сравнению. Сравниваемые элементы данных указываются в части on данного оператора. Поэтому если переменная_диапазона_А. свойство и переменная_диапазона_А . свойство равны, то эти элементы данных "увязываются" успешно. По существу, оператор join выполняет роль своеобразного фильтра, отбирая только те элементы данных, которые имеют общее значение.
|
|
Как правило, оператор join возвращает последовательность, состоящую из данных, полученных из двух источников. Следовательно, с помощью оператора jоin можно сформировать новый список, состоящий из элементов, полученных из двух разных источников данных. Это дает возможность организовать данные по-новому.
Ниже приведена программа, в которой создается класс Item, инкапсулирующий наименование товара и его порядковый номер. Затем в этой программе создается еще один класс InStockStatus, связывающий порядковый номер товара с булевым свойством, которое указывает на наличие или отсутствие товара на складе. И наконец, в данной программе создается класс Temp с двумя полями: строковым (string) и булевым (bool). В объектах этого класса будут храниться результаты запроса. В этом запросе оператор join используется для получения списка, в котором наименование товара связывается с состоянием его запасов на складе.
// Продемонстрировать применение оператора join.
using System;
using System.Linq;
// Класс, связывающий наименование товара с его порядковым номером,
|
|
class Item {
public string Name { get; set; }
public int ItemNumber { get; set; }
public Item(string n, int inum) {
Name = n;
ItemNumber = inum;
}
}
// Класс, связывающий наименование товара
// с состоянием его запасов на складе,
class InStockStatus {
public int ItemNumber { get; set; }
public bool InStock { get; set; }
public InStockStatus (int n, bool b) {
ItemNumber = n;
InStock = b;
}
}
// Класс, инкапсулирующий наименование товара и
// состояние его запасов на складе,
class Temp {
public string Name { get; set; }
public bool InStock { get; set; }
public Temp(string n, bool b) {
Name = n;
InStock = b;
}
}
class JoinDemo {
static void Main() {
Item[] items = {
new Item("Кусачки", 1424), new Item("Тиски", 7892),
new Item("Молоток", 8534), new Item("Пила", 6411)
};
InStockStatus[] statusList = {
New InStockStatus(1424, true),
New InStockStatus(7892, false),
New InStockStatus(8534, true),
New InStockStatus(6411, true)
};
Сформировать запрос, объединяющий объекты классов Item
И InStockStatus для составления списка наименований товаров
И их наличия на складе. Обратите внимание на формирование
Последовательности объектов класса Temp,
var inStockList = from item in items
Join entry in statusList
On item.ItemNumber equals entry.ItemNumber
select new Temp(item.Name, entry.InStock);
Console.WriteLine("Товар\tНаличие\n");
Выполнить запрос и вывести его результаты.
|
|
Дата добавления: 2019-02-12; просмотров: 256; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!