Типизированные DataSet

87

»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ

В предыдущих приводились многочисленные примеры опроса объектов DataTable, которые в реальных приложениях естественным образом поступают от типичных DataSet. Но для простоты объекты DataTable создавались программно, используя объявление статического массива. Однако запросы DataSet — это нечто большее, чем просто создание объектов DataTable из статически объявленных массивов.

К тому же примеры, приводившиеся ранее, выполнялись на нетипизированных DataSet. Иногда может возникнуть необходимость выполнения запроса к типизированному объекту DataSet. API-интерфейс LINQ to DataSet это также позволяет.

Типизированные DataSet могут быть опрошены с использованием LINQ, как это возможно и с нетипизированными. Однако типизированные DataSet позволяют упростить код запросов LINQ и сделать его более читабельным. Поскольку существует класс для DataSet, при запросе к типизированному DataSet можно обращаться к именам таблиц и столбцов, используя свойства типизированного класса DataSet, вместо индексации в коллекции Tables или применения операций Field<T> и SetField<T>.

Поэтому вместо следующего обращения к таблице объекта DataSet по имени Students:

DataTable Students = dataSet.Tables["Students"];

можно обратиться так:

DataTable Students = dataSet.Students;

Вместо получения значения поля вида:

dataRow.Field<string>("Name")

его можно получить следующим образом:

dataRow.Name

Это без сомнения делает код более читабельным и упрощает его сопровождение.

Прежде чем продемонстрировать пример, понадобится создать типизированный DataSet. Для этого выполните описанные ниже шаги:

В результате создан типизированный DataSet по имени StudentsDataSet, который содержит объект DataTable по имени Students с двумя столбцами данных типа DataColumn. Этот типизированный DataSet можно использовать для выполнения запросов LINQ, и поскольку DataSet типизирован, к полям DataRow можно обращаться как к членам класса. Давайте рассмотрим пример:

StudentDataSet studentDataSet = new StudentDataSet();
            studentDataSet.Students.AddStudentsRow(1, "Александр Ерохин");
            studentDataSet.Students.AddStudentsRow(7, "Елена Волкова");
            studentDataSet.Students.AddStudentsRow(13, "Дмитрий Моисеенко");
            studentDataSet.Students.AddStudentsRow(72, "Андрей Мухамедшин");

            string name =
              studentDataSet.Students.Where(student => student.Id == 7).Single().Name;

            Console.WriteLine(name);

В этом примере создается объект StudentsDataSet, к которому добавляются четыре записи о студентах с использованием имен. Как правило, в рабочем коде делать это не придется, потому что, скорее всего, эта информация будет извлекаться из базы данных.

После наполнения данными типизированного DataSet к нему выполняется запрос. Обратите внимание, что обращением к таблице DataTable по имени Students производится как к свойству объекта StudentsDataSet. Кроме того, в лямбда-выражении операции Where имеется прямое обращение к свойству Id элемента, который должен быть DataRow — вместо вызова свойства Field этого DataRow. Это можно делать потому, что объект DataSet типизирован. По этой же причине, после получения единственного объекта DataRow вызовом операции Single можно напрямую обращаться к его свойству Name. Результат показан ниже:

Пример запроса к типизированному DataSet

Разве не здорово? Типизированные DataSet делают взаимодействие с DataSet таким же простым, как работа с нормальными объектами классов и их свойствами.

Пройди тесты
Лучший чат для C# программистов