Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_CSharp_4.docx
Скачиваний:
37
Добавлен:
02.11.2018
Размер:
237.61 Кб
Скачать

4.11. Навигация, Поиск и фильтрация данных в DataSet

В примерах данного параграфа предполагается, что имеется набор данных с заданной схемой (см. параграф 4.11), и в этот набор загружены две таблицы из базы CD_Rent.

Наличие в схеме данных связей между таблицами позволяет осуществлять навигацию по набору данных. Для этого используются методы GetChildRows(), GetParentRow() и GetParentRows() класса DataRow.

Метод GetChildRows() возвращает массив дочерних строк той строки, у которой вызывается. Метод принимает в качестве параметра имя связи между таблицами либо объект, описывающий связь. В следующем фрагменте кода для каждого исполнителя выводится список его дисков:

foreach (DataRow row in Artists.Rows)

{

Console.WriteLine(row["name"]);

foreach (var r in row.GetChildRows("Artists_to_Disks"))

{

Console.WriteLine(r["title"]);

}

}

Метод GetParentRow() позволяет получить родительскую строку. Как и предыдущий метод, GetParentRow() принимает в качестве параметра имя связи между таблицами либо объект, описывающий связь. В примере для каждого диска выводится его исполнитель:

foreach (DataRow row in Disks.Rows)

{

Console.Write(row["title"]);

var parentRow = row.GetParentRow("Artists_to_Disks");

Console.WriteLine(parentRow["name"]);

}

Метод GetParentRows() возвращает все родительские строки определенной строки. Данный метод имеет смысл использовать, если задана такая связь, при которой колонка родительской таблицы не является первичным ключом (не уникальна).

Все три рассмотренных метода имеют перегруженные варианты, которые позволяют получить заданную версию строки. Версия указывается в качестве дополнительного параметра.

Достаточно часто возникает задача поиска информации в таблице. Для этого можно использовать два метода. Первый – Find(), позволяет искать строки по значениям первичного ключа. Второй – Select(), выступает в качестве фильтра, возвращая строки данных, удовлетворяющие критериям поиска.

Метод Find(), который предоставляет класс DataRowCollection ищет строки таблицы с определенным значением первичного ключа. Метод Find() принимает как параметр значение первичного ключа искомой строки. Поскольку значения первичного ключа уникальны, метод вернет не более одного объекта DataRow. Следующий фрагмент кода ищет данные в таблице Artists:

// в Artists определен первичный ключ.

// Find() принимает как параметр объект

// и сам приводит его к нужному типу

DataRow row = Artists.Rows.Find(1);

if (row != null)

{

Console.WriteLine(row["name"]);

}

Метод Find() перегружен в расчете на случаи, когда первичный ключ DataTable состоит из нескольких объектов DataColumn. В этом случае в Find() передается массив объектов, представляющих значения первичного ключа.

Метод Select() класса DataTable позволяет искать ряды по определенному критерию. В простейшем случае методу передается строка, описывающая критерий поиска. Метод возвращает массив найденных строк. В следующем примере из таблицы Disks выбираются все диски, записанные в 2006 году:

DataRow[] result = Disks.Select("release_year = 2006");

Метод Select() перегружен. Вы можете просто передать строку запроса, а можете включить в нее порядок сортировки, а также параметр, определяющий состояние искомых строк (например, только добавленные строки или только измененные).