Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Типизированные 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. Для этого выполните описанные ниже шаги:

  • Щелкните правой кнопкой мыши на проекте в окне Solution Explorer (Проводник решения).

  • Выберите в контекстном меню пункт Add --> New Item (Добавить --> Новый элемент).

  • Разверните узел Categories (Категории) в диалоговом окне Add New Item (Добавить новый элемент). Выберите в узел Data (Данные). Выберите шаблон DataSet в списке Data Templates (Шаблоны данных). Измените имя файла DataSet на StudentsDataSet.xsd и щелкните на кнопке Add (Добавить).

    Новый шаблон DataSet
  • После этого должен открыться визуальный конструктор наборов данных (DataSet Designer). Перетащите элемент DataTable из панели инструментов на поверхность визуального конструктора.

  • Щелкните правой кнопкой мыши на заголовке, добавленном DataTable, и выберите в контекстном меню пункт Properties (Свойства).

  • В открывшемся окне Properties (Свойства) измените свойство Name объекта DataTable, присвоив ему значение Students.

  • Снова щелкните правой кнопкой мыши на DataTable и выберите в контекстном меню пункт Add --> Column (Добавить --> Столбец).

  • Установите свойство Name вновь добавленного объекта DataColumn в Id, а свойство DataType — в System.Int32.

  • Снова щелкните правой кнопкой мыши на DataTable и выберите в контекстном меню пункт Add --> Column.

  • Установите свойство Name вновь добавленного объекта DataColumn в 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 таким же простым, как работа с нормальными объектами классов и их свойствами.

Пройди тесты