Dela via


Frågor mellan tabeller (LINQ till DataSet)

Förutom att köra frågor mot en enskild tabell kan du även köra frågor mellan tabeller i LINQ till DataSet. Detta görs med hjälp av en koppling. En koppling är associationen av objekt i en datakälla med objekt som delar ett gemensamt attribut i en annan datakälla, till exempel en produkt eller kontakt-ID. I objektorienterad programmering är relationer mellan objekt relativt enkla att navigera eftersom varje objekt har en medlem som refererar till ett annat objekt. I externa databastabeller är det dock inte lika enkelt att navigera i relationer. Databastabeller innehåller inte inbyggda relationer. I dessa fall kan kopplingsåtgärden användas för att matcha element från varje källa. Med tanke på två tabeller som innehåller produktinformation och försäljningsinformation kan du till exempel använda en kopplingsåtgärd för att matcha försäljningsinformation och produkter för samma försäljningsorder.

Linq-ramverket (Language-Integrated Query) innehåller två kopplingsoperatorer Join och GroupJoin. Dessa operatorer utför likvärdiga kopplingar: det vill: kopplingar som matchar två datakällor endast när deras nycklar är lika. (Transact-SQL stöder däremot andra kopplingsoperatorer än equals, till exempel operatorn less than .)

I relationella databastermer Join implementerar en inre koppling. En inre koppling är en typ av koppling där endast de objekt som har en matchning i den motsatta datauppsättningen returneras.

Operatorerna har ingen direkt motsvarighet i relationella databastermer. De GroupJoin implementerar en superuppsättning inre kopplingar och vänster yttre kopplingar. En vänster yttre koppling är en koppling som returnerar varje element i den första (vänstra) samlingen, även om den inte har några korrelerade element i den andra samlingen.

Mer information om kopplingar finns i Kopplingsåtgärder.

Exempel

I följande exempel utförs en traditionell koppling av tabellerna SalesOrderHeader och SalesOrderDetail från AdventureWorks-exempeldatabasen för att hämta onlinebeställningar från augusti månad.

// 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

Se även