Типизированные DataSet
87LINQ --- LINQ to DataSet и SQL --- Типизированные DataSet
»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ
В предыдущих приводились многочисленные примеры опроса объектов 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 Designer). Перетащите элемент DataTable из панели инструментов на поверхность визуального конструктора.
Щелкните правой кнопкой мыши на заголовке, добавленном DataTable, и выберите в контекстном меню пункт Properties (Свойства).
В открывшемся окне Properties (Свойства) измените свойство Name объекта DataTable, присвоив ему значение Students.
Снова щелкните правой кнопкой мыши на DataTable и выберите в контекстном меню пункт Add --> Column (Добавить --> Столбец).
Установите свойство Name вновь добавленного объекта DataColumn в Id, а свойство DataType — в System.Int32.
Снова щелкните правой кнопкой мыши на DataTable и выберите в контекстном меню пункт Add --> Column.
Установите свойство Name вновь добавленного объекта DataColumn в Name.
Сохраните файл.
В результате создан типизированный 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 таким же простым, как работа с нормальными объектами классов и их свойствами.