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

Запросы к наборам данных с помощью linq to DataSet

Перед выполнением запроса к объекту DataSetс помощью LINQ to DataSet необходимо поместить данные в объектDataSet. Существует несколько способов загрузки данных вDataSet, например с помощью классаDataAdapterилиLINQ to SQL. После того как в объектеDataSetпоявятся данные, к нему можно выполнять запросы. Подготовка запросов с помощью LINQ to DataSet похожа на использование LINQ (Language-Integrated Query) с другими источниками данных, поддерживающих LINQ. Запросы LINQ могут выполняться к одиночным таблицамDataSetили к нескольким таблицам с помощью стандартных операторов запросаJoinиGroupJoin.

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

В дополнение к стандартным операторам запросов, реализованным в библиотеке System.Core.dll, LINQ to DataSet добавляет некоторые, специфичные для DataSetрасширения, которые облегчают запросы через набор объектовDataRow. Эти специфичные дляDataSetрасширения включают в себя операторы для сравнения последовательностей строк, а также методы, обеспечивающие доступ к значениям столбцовDataRow.

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

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

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

Следующая схема показывает, как технология LINQ to DataSet связана с DataSetи встраивается в многоуровневое приложение:

См. также

Загрузка данных в DataSet

Объект DataSetнеобходимо заполнить, прежде чем направлять к нему запросы LINQ to DataSet.Существует несколько способов заполнения объектаDataSet. Например, можно использовать LINQ to SQL для запроса к базе данных и загрузки результатов в объектDataSet. Дополнительные сведения см. в разделеLINQ to SQL.

Другой распространенный способ загрузки данных в объект DataSet— использование классаDataAdapterдля получения данных из базы данных. Это показано в следующем примере.

Пример

В этом примере объект DataAdapterиспользуется для запроса к базе данных AdventureWorks, получения сведений о продажах начиная с 2002 года и загрузки результатов в объектDataSet.После заполнения объектаDataSetможно создавать к нему запросы с помощью LINQ to DataSet.Метод FillDataSet, используемый в данном примере, также используется в примерах запросов в разделеПримеры LINQ to DataSet.Дополнительные сведения см. в разделеЗапросы к объектам DataSet (LINQ to DataSet).

C#

try

{

// Create a new adapter and give it a query to fetch sales order, contact,

// address, and product information for sales in the year 2002. Point connection

// information to the configuration setting "AdventureWorks".

string connectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;"

+ "Integrated Security=true;";

SqlDataAdapter da = new SqlDataAdapter(

"SELECT SalesOrderID, ContactID, OrderDate, OnlineOrderFlag, " +

"TotalDue, SalesOrderNumber, Status, ShipToAddressID, BillToAddressID " +

"FROM Sales.SalesOrderHeader " +

"WHERE DATEPART(YEAR, OrderDate) = @year; " +

"SELECT d.SalesOrderID, d.SalesOrderDetailID, d.OrderQty, " +

"d.ProductID, d.UnitPrice " +

"FROM Sales.SalesOrderDetail d " +

"INNER JOIN Sales.SalesOrderHeader h " +

"ON d.SalesOrderID = h.SalesOrderID " +

"WHERE DATEPART(YEAR, OrderDate) = @year; " +

"SELECT p.ProductID, p.Name, p.ProductNumber, p.MakeFlag, " +

"p.Color, p.ListPrice, p.Size, p.Class, p.Style, p.Weight " +

"FROM Production.Product p; " +

"SELECT DISTINCT a.AddressID, a.AddressLine1, a.AddressLine2, " +

"a.City, a.StateProvinceID, a.PostalCode " +

"FROM Person.Address a " +

"INNER JOIN Sales.SalesOrderHeader h " +

"ON a.AddressID = h.ShipToAddressID OR a.AddressID = h.BillToAddressID " +

"WHERE DATEPART(YEAR, OrderDate) = @year; " +

"SELECT DISTINCT c.ContactID, c.Title, c.FirstName, " +

"c.LastName, c.EmailAddress, c.Phone " +

"FROM Person.Contact c " +

"INNER JOIN Sales.SalesOrderHeader h " +

"ON c.ContactID = h.ContactID " +

"WHERE DATEPART(YEAR, OrderDate) = @year;",

connectionString);

// Add table mappings.

da.SelectCommand.Parameters.AddWithValue("@year", 2002);

da.TableMappings.Add("Table", "SalesOrderHeader");

da.TableMappings.Add("Table1", "SalesOrderDetail");

da.TableMappings.Add("Table2", "Product");

da.TableMappings.Add("Table3", "Address");

da.TableMappings.Add("Table4", "Contact");

// Fill the DataSet.

da.Fill(ds);

// Add data relations.

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

DataTable orderDetail = ds.Tables["SalesOrderDetail"];

DataRelation order = new DataRelation("SalesOrderHeaderDetail",

orderHeader.Columns["SalesOrderID"],

orderDetail.Columns["SalesOrderID"], true);

ds.Relations.Add(order);

DataTable contact = ds.Tables["Contact"];

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

DataRelation orderContact = new DataRelation("SalesOrderContact",

contact.Columns["ContactID"],

orderHeader2.Columns["ContactID"], true);

ds.Relations.Add(orderContact);

}

catch (SqlException ex)

{

Console.WriteLine("SQL exception occurred: " + ex.Message);

}