Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_redaktsia_2013.docx
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
931.98 Кб
Скачать
  1. Linq to DataSet. Общие сведения о linq to DataSet.

Класс DataSet является одним из наиболее распространенных компонентов ADO.NET. Это ключевой элемент модели автономного программирования, построенный на основе ADO.NET. Он позволяет явным образом кэшировать данные из различных источников данных. На уровне представления DataSet тесно интегрируется с элементами управления с помощью графического интерфейса привязки данных.

На среднем уровне он предоставляет кэш, который защищает реляционную форму данных и включает в себя простые службы обеспечения быстрых запросов и навигации по иерархии. Распространенным приемом, используемым для уменьшения числа запросов к базе данных, является использование DataSet для кэширования на среднем уровне. Например, рассмотрим управляемое данными веб-приложение ASP.NET. Обычно значительная часть данных приложения изменяется нечасто и остается неизменной во время сеанса пользователя. Эти данные могут сохраняться в памяти веб-сервера, что сократит число запросов к базе данных и ускорит взаимодействие с пользователями.

Другим полезным аспектом DataSet является то, что приложения могут переносить подмножества данных из одного или нескольких источников данных в пространство приложения. Затем приложение может работать с данными в памяти как с реляционными данными.

Объект DataSet имеет ограниченные возможности запросов. Метод Select можно использовать для фильтрации и сортировки, а методы GetChildRows и GetParentRow - для навигации по иерархии. Для более сложных операций необходимо писать пользовательские запросы.Это может снизить производительность приложений и создать трудности при их сопровождении.

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

Технология LINQ to DataSet построена на основе архитектуры ADO.NET 2.0 и использует ее, но не заменяет ADO.NET 2.0 в коде приложения. Существующий код ADO.NET 2.0 будет по-прежнему работать в приложении LINQ to DataSet. Связь LINQ to DataSet и ADO.NET 2.0 с хранилищем данных показана на следующей схеме.

  1. Linq to DataSet. Запросы к одиночным таблицам.

Запросы LINQ (Language-Integrated Query) работают с источниками данных, которые реализуют интерфейс IEnumerable&ltT> или интерфейс 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&ltbool>("OnlineOrderFlag") == true

select new

{

SalesOrderID = order.Field&ltint>("SalesOrderID"),

OrderDate = order.Field&ltDateTime>("OrderDate"),

SalesOrderNumber = order.Field&ltstring>("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&ltT>, результат запроса откладывается до тех пор, пока переменная запроса проходит по циклу foreach.Отложенный результат запроса позволяет запросам храниться в виде значений, которые могут вычисляться несколько раз, каждый раз давая потенциально различные результаты.

Метод Field обеспечивает доступ к значениям столбцов DataRow и SetField (что не показано в предыдущем примере) и устанавливает значения столбцов в DataRow.Оба метода, Field и SetField, обрабатывают типы, допускающие значения NULL, поэтому нет необходимости явно проводить проверку на значения NULL.Оба метода являются универсальными методами, что означает, что нет необходимости приводить возвращаемый тип. В DataRow нужно использовать предопределенный метод доступа к столбцам (например, o["OrderDate"]), однако в этом случае приведение возвращаемого объекта к соответствующему типу обязательно.Если столбец допускает значение NULL, необходимо проверить его на значение NULL, используя метод IsNull. Дополнительные сведения см. в разделе Универсальные методы Field и SetField (LINQ to DataSet). Обратите внимание, что тип данных, определяемый в универсальном параметре T методов Field и SetField, должен соответствовать типу базового значения, иначе сформируется исключение InvalidCastException. Указанное имя столбца должно совпадать с именем столбца в DataSet, иначе это вызовет исключение ArgumentException.В обоих случаях исключении возникает при перечислении данных во время выполнения в момент выполнения запроса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]