Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Запрос к типизированным объектам DataSet

Если схема объекта DataSetизвестна во время разработки приложения, при создании запроса LINQ to DataSet рекомендуется использовать типизированный объектDataSet.Типизированный объектDataSetпредставляет класс, производный отDataSet. Поэтому он наследует все методы, события и свойства классаDataSet. Кроме того, типизированный объектDataSetпредоставляет методы, события и свойства со строгой типизацией. Это означает, что доступ к таблицам и столбцам можно получить по имени, не используя методы на основе коллекций. Это упрощает запросы и повышает их читаемость. Дополнительные сведения см. в разделеТипизированные объекты DataSet (ADO.NET).

LINQ to DataSet также поддерживает запросы к типизированным объектам DataSet. Если объектDataSetтипизирован, нет необходимости использовать универсальный методFieldили методSetFieldдля доступа к данным столбцов. Имена свойств доступны во время компиляции, так как сведения о типе включаются в объектDataSet. Запрос LINQ to DataSet предоставляет доступ к значениям столбцов правильного типа, поэтому ошибки несоответствия типов обнаруживаются во время компиляции, а не во время выполнения.

Прежде чем направлять запросы к типизированному объекту DataSet, необходимо создать класс с помощью конструктора DataSet в среде Visual Studio 2008.Дополнительные сведения см. в разделеПрактическое руководство. Создание типизированного набора данных.

Пример

В следующем примере показан запрос к типизированному объекту DataSet:

C#

var query = from o in orders

where o.OnlineOrderFlag == true

select new { o.SalesOrderID,

o.OrderDate,

o.SalesOrderNumber };

foreach(var order in query)

{

Console.WriteLine("{0}\t{1:d}\t{2}",

order.SalesOrderID,

order.OrderDate,

order.SalesOrderNumber);

}

Универсальные методы Field и SetField (linq to DataSet)

LINQ to DataSet реализует методы расширений класса DataRowдля доступа к значениям столбцов:FieldиSetField. Эти методы предоставляют разработчикам более простой доступ к значениям столбцов, особенно в отношении значений NULL. ОбъектDataSetиспользует для представления значений NULL классValue, тогда как LINQ использует поддержку платформой .NET Framework 2.0 типов, допускающих значения NULL.Использование существующего метода доступа столбцов в объектеDataRowтребует приведения возвращаемого объекта к нужному типу.Если определенное поле в объектеDataRowможет иметь значение NULL, необходимо явно проверить наличие значения NULL, поскольку при возвращении объектаValueи неявном приведении его к другому типу возникает исключениеInvalidCastException.В следующем примере, если методIsNullне использовался для проверки на значение NULL, возникнет исключение, если индексатор возвращает объектValueи пытается привести его к типуString.

C#

// Fill the DataSet.

DataSet ds = new DataSet();

ds.Locale = CultureInfo.InvariantCulture;

FillDataSet(ds);

DataTable products = ds.Tables["Product"];

var query =

from product in products.AsEnumerable()

where !product.IsNull("Color") &&

(string)product["Color"] == "Red"

select new

{

Name = product["Name"],

ProductNumber = product["ProductNumber"],

ListPrice = product["ListPrice"]

};

foreach (var product in query)

{

Console.WriteLine("Name: {0}", product.Name);

Console.WriteLine("Product number: {0}", product.ProductNumber);

Console.WriteLine("List price: ${0}", product.ListPrice);

Console.WriteLine("");

}

Метод Fieldпредоставляет доступ к значениям столбцов вDataRow, а методSetFieldустанавливает значения столбцов вDataRow.Оба метода,FieldиSetField, обрабатывают типы, допускающие значения NULL, поэтому нет необходимости явно проводить проверку на значения NULL, как в предыдущем примере.Оба метода являются универсальными, поэтому приводить возвращенные данные к определенному типу не нужно.

В следующем примере используется метод Field.

C#

// Fill the DataSet.

DataSet ds = new DataSet();

ds.Locale = CultureInfo.InvariantCulture;

FillDataSet(ds);

DataTable products = ds.Tables["Product"];

var query =

from product in products.AsEnumerable()

where product.Field<string>("Color") == "Red"

select new

{

Name = product.Field<string>("Name"),

ProductNumber = product.Field<string>("ProductNumber"),

ListPrice = product.Field<Decimal>("ListPrice")

};

foreach (var product in query)

{

Console.WriteLine("Name: {0}", product.Name);

Console.WriteLine("Product number: {0}", product.ProductNumber);

Console.WriteLine("List price: ${0}", product.ListPrice);

Console.WriteLine("");

}

Обратите внимание, что тип данных, определяемый в универсальном параметре T метода Fieldи методаSetField, должен совпадать с типом базового значения.В противном случае возникнет исключениеInvalidCastException.Указанное имя столбца также должно совпадать с именем столбца вDataSet, в противном случае возникнет исключениеArgumentException.В обоих случаях исключения возникают во время выполнения при перечислении данных в ходе выполнения запроса.

Метод SetFieldсам по себе не выполняет преобразования типов.Однако это не означает, что преобразование типов не происходит.МетодSetFieldреализует поведение ADO.NET 2.0 классаDataRow.Преобразование типов может быть выполнено объектомDataRow, а преобразованное значение затем будет сохранено в объектеDataRow.