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

Перекрестные запросы между таблицами (linq to DataSet)

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

LINQ (Language-Integrated Query) реализует два оператора соединения: JoinиGroupJoin. Эти операторы выполняют эквивалентные соединения, то есть соединения, связывающие два источника данных по равенству ключей.(В отличие от этого, Transact-SQL поддерживает операторы соединения, отличные от equals, например оператор less than.)

В терминах реляционной базы данных оператор Joinвыполняет внутреннее соединение.Внутреннее соединение представляет собой соединение, при котором возвращаются только объекты, имеющие соответствия в другом наборе данных.

Операторы GroupJoinне имеют прямых аналогов в реляционных базах данных, используют надмножества внутренних соединений и левых внешних соединений. Левое внешнее соединение представляет собой соединение, возвращающее каждый элемент первой (левой) коллекции, даже если он не имеет соответствующих элементов во второй коллекции.

Дополнительные сведения о соединениях см. в разделе Операции соединения.

Пример

В следующем примере выполняется традиционное соединение таблиц SalesOrderHeader и SalesOrderDetail из образца базы данных AdventureWorks для получения заказов, сделанных через Интернет начиная с августа.

VB

C#

C++

F#

JScript

Копировать

// Fill the DataSet.

DataSet ds = new DataSet();

ds.Locale = CultureInfo.InvariantCulture;

FillDataSet(ds);

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

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

var query =

from order in orders.AsEnumerable()

join detail in details.AsEnumerable()

on order.Field<int>("SalesOrderID") equals

detail.Field<int>("SalesOrderID")

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

&& order.Field<DateTime>("OrderDate").Month == 8

select new

{

SalesOrderID =

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

SalesOrderDetailID =

detail.Field<int>("SalesOrderDetailID"),

OrderDate =

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

ProductID =

detail.Field<int>("ProductID")

};

foreach (var order in query)

{

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

order.SalesOrderID,

order.SalesOrderDetailID,

order.OrderDate,

order.ProductID);

}

См. также

LINQ to SQL

LINQ to SQLпредоставляетинфраструктуру времени выполнения для управления реляционными данными в виде объектов. ВLINQ to SQLмодель данных реляционной базы данных сопоставляется объектной модели, выраженной в языке программирования разработчика. При выполнении приложенияLINQ to SQLпреобразует интегрированные в язык запросы из объектной модели в SQL и отправляет их в базу данных для выполнения. Когда база данных возвращает результаты,LINQ to SQLпереводит их обратно в объекты, которыми можно управлять.

LINQ to SQL включает поддержку хранимых процедур, определяемых пользователем функций в базе данных и наследования в объектной модели.