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

Многоуровневые приложения и linq to DataSet

Многоуровневые приложения обработки данных — это приложения, ориентированные на данные, разделенные на несколько логических уровней. Типичное многоуровневое приложение включает в себя уровень представления, средний уровень и уровень данных. Разделение компонентов приложения на уровни повышает удобство поддержки и масштабирования приложения. Дополнительные сведения о многоуровневых приложениях см. в разделе Работа с наборами данных в N-уровневых приложениях.

В многоуровневых приложениях объект DataSetчасто используется на среднем уровне, чтобы кэшировать данные для веб-приложений. Функциональность запросовLINQ to DataSetреализована через методы расширений и расширяет возможности классаDataSet, существующего в ADO.NET 2.0.

Запросы к одиночным таблицам (linq to DataSet)

Запросы LINQ (Language-Integrated Query) работают с источниками данных, которые реализуют интерфейс IEnumerable<T>или интерфейс IQueryable.Класс DataTable не реализует ни один из этих интерфейсов, в связи с этим необходимо вызывать метод AsEnumerable, если в качестве источника в предложении From запроса LINQ используется DataTable.

В следующем примере получаются все активные заказы из таблицы SalesOrderHeader и выводится на консоль идентификатор, дата и номер заказа.

C#

// Fill the DataSet.

DataSet ds = new DataSet();

ds.Locale = CultureInfo.InvariantCulture;

FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];

var query =

from order in orders.AsEnumerable()

where order.Field<bool>("OnlineOrderFlag") == true

select new

{

SalesOrderID = order.Field<int>("SalesOrderID"),

OrderDate = order.Field<DateTime>("OrderDate"),

SalesOrderNumber = order.Field<string>("SalesOrderNumber")

};

foreach (var onlineOrder in query)

{

Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",

onlineOrder.SalesOrderID,

onlineOrder.OrderDate,

onlineOrder.SalesOrderNumber);

}

Запрос локальной переменной инициализирован выражением запроса, которое работает с одним или несколькими источниками данных, путем выполнения одного или нескольких стандартных операторов запроса или, как в случае LINQ to DataSet, операторов, специфичных для класса DataSet. Выражение запроса в предыдущем примере использует два стандартных оператора запроса: Where и Select.

Предложение Whereфильтрует последовательность на основе состояния. В данном случае переменнаяOnlineOrderFlagустановлена в true. ОператорSelectназначает и возвращает перечислимый объект, который перехватывает параметры, передаваемые оператору. В предыдущем примере анонимный тип создан с тремя свойствами:SalesOrderID, OrderDate, SalesOrderNumber. Этим трем свойствам присвоены значения из столбцовSalesOrderID, OrderDate и SalesOrderNumber таблицы SalesOrderHeader.

Затем цикл foreachпроходит по перечислимому объекту, возвращенному операторомSelect, и выдает результаты запроса. Так как этот запрос имеет типEnumerable, который реализует интерфейсIEnumerable<T>, результат запроса откладывается до тех пор, пока переменная запроса проходит по циклуforeach. Отложенный результат запроса позволяет запросам храниться в виде значений, которые могут вычисляться несколько раз, каждый раз давая потенциально различные результаты.

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

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

Пример

В следующем примере показан запрос к типизированному объекту 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);

}