Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Помимо запроса одной таблицы, можно также выполнять меж табличные запросы в LINQ to DataSet. Это делается с помощью соединения. Соединение — это связь объектов в одном источнике данных с объектами, которые совместно используют общий атрибут в другом источнике данных, например продукт или идентификатор контакта. В объектно-ориентированном программировании отношения между объектами относительно легко перемещаться, так как каждый объект имеет элемент, ссылающийся на другой объект. Однако в таблицах внешней базы данных навигация не так проста. Таблицы баз данных не содержат встроенных связей. В таких случаях операция соединения может использоваться для сопоставления элементов из каждого источника. Например, учитывая две таблицы, содержащие сведения о продукте и сведения о продажах, можно использовать операцию соединения для сопоставления сведений о продажах и продуктах для одного заказа на продажу.
Платформа запросов Language-Integrated (LINQ) предоставляет два оператора соединения: Join и GroupJoin. Эти операторы выполняют эквивалентные соединения: то есть соединения, соответствующие двум источникам данных, только если их ключи равны. Напротив, Transact-SQL поддерживает операторы соединения, отличные от equals
, такие как оператор less than
.
В терминах реляционной базы данных Join реализует внутреннее соединение. Внутреннее соединение — это тип соединения, в котором возвращаются только те объекты, которые имеют совпадение в противоположном наборе данных.
Операторы GroupJoin не имеют прямого эквивалента в терминах реляционной базы данных; они реализуют супермножество операций внутренних соединений и левых внешних соединений. Левое внешнее соединение — это соединение, которое возвращает каждый элемент первой (левой) коллекции, даже если в второй коллекции нет коррелированных элементов.
Дополнительные сведения о соединениях см. в разделе "Операции присоединения".
Пример
В следующем примере выполняется традиционное соединение таблиц SalesOrderHeader
и SalesOrderDetail
из образца базы данных AdventureWorks для получения онлайн-заказов за август.
// 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($"{order.SalesOrderID}\t{order.SalesOrderDetailID}\t{order.OrderDate:d}\t{order.ProductID}");
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim details As DataTable = ds.Tables("SalesOrderDetail")
Dim query = _
From order In orders.AsEnumerable() _
Join detail In details.AsEnumerable() _
On order.Field(Of Integer)("SalesOrderID") Equals _
detail.Field(Of Integer)("SalesOrderID") _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _
order.Field(Of DateTime)("OrderDate").Month = 8 _
Select New With _
{ _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.ProductID = detail.Field(Of Integer)("ProductID") _
}
For Each order In query
Console.WriteLine(order.SalesOrderID & vbTab & _
order.SalesOrderDetailID & vbTab & _
order.OrderDate & vbTab & _
order.ProductID)
Next