Query's tussen tabellen (LINQ naar DataSet)
Naast het uitvoeren van query's op één tabel, kunt u ook query's tussen tabellen uitvoeren in LINQ naar DataSet. Dit wordt gedaan met behulp van een join. Een join is de koppeling van objecten in de ene gegevensbron met objecten die een gemeenschappelijk kenmerk in een andere gegevensbron delen, zoals een product of contactpersoon-id. In objectgeoriënteerde programmering zijn relaties tussen objecten relatief eenvoudig te navigeren, omdat elk object een lid heeft dat verwijst naar een ander object. In externe databasetabellen is het navigeren in relaties echter niet zo eenvoudig. Databasetabellen bevatten geen ingebouwde relaties. In deze gevallen kan de join-bewerking worden gebruikt om elementen uit elke bron te vinden. Als u bijvoorbeeld twee tabellen hebt die productinformatie en verkoopgegevens bevatten, kunt u een joinbewerking gebruiken om verkoopgegevens en producten voor dezelfde verkooporder te vinden.
Het LINQ-framework (Language-Integrated Query) biedt twee joinoperators en Join GroupJoin. Deze operators voeren equi-joins uit: dat wil gezegd: joins die alleen overeenkomen met twee gegevensbronnen wanneer hun sleutels gelijk zijn. (Transact-SQL ondersteunt daarentegen join-operators anders dan equals
de less than
operator.)
Implementeert in relationele databasetermen Join een inner join. Een inner join is een type join waarin alleen objecten met een overeenkomst in de tegenovergestelde gegevensset worden geretourneerd.
De GroupJoin operators hebben geen direct equivalent in relationele databasetermen; ze implementeren een superset van inner joins en left outer joins. Een left outer join is een join die elk element van de eerste (linker) verzameling retourneert, zelfs als deze geen gecorreleerde elementen in de tweede verzameling bevat.
Zie Join Operations voor meer informatie over joins.
Opmerking
In het volgende voorbeeld wordt een traditionele join van de SalesOrderHeader
en SalesOrderDetail
tabellen uit de voorbeelddatabase AdventureWorks uitgevoerd om online bestellingen te verkrijgen van de maand augustus.
// 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);
}
' 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