Query su tabella incrociata (LINQ to DataSet)Cross-Table Queries (LINQ to DataSet)

Oltre alle query su singola tabella, è possibile eseguire query tra tabelle in LINQ to DataSetLINQ to DataSetIn addition to querying a single table, you can also perform cross-table queries in LINQ to DataSetLINQ to DataSet. Questa operazione viene eseguita utilizzando un join.This is done by using a join. Per join si intende l'associazione degli oggetti di un'origine dati con oggetti di un'altra origine dati che condividono un attributo comune, ad esempio un ID prodotto o contatto.A join is the association of objects in one data source with objects that share a common attribute in another data source, such as a product or contact ID. Nella programmazione orientata a oggetti, lo spostamento nelle relazioni tra oggetti è relativamente semplice, perché ogni oggetto include un membro che fa riferimento a un altro oggetto.In object-oriented programming, relationships between objects are relatively easy to navigate because each object has a member that references another object. Nelle tabelle di database esterne, tuttavia, lo spostamento nelle relazioni non è un processo così semplice.In external database tables, however, navigating relationships is not as straightforward. Le tabelle di database non contengono relazioni predefinite.Database tables do not contain built-in relationships. In questi casi, l'operazione join può essere utilizzata per far corrispondere gli elementi di ogni origine.In these cases, the join operation can be used to match elements from each source. Ad esempio, date due tabelle contenenti informazioni sui prodotti e sulle vendite, è possibile usare un'operazione join per creare una corrispondenza tra le informazioni sulle vendite e i prodotti relativi allo stesso ordine di vendita.For example, given two tables that contain product information and sales information, you could use a join operation to match sales information and products for the same sales order.

Nel framework LINQ (Language-Integrated Query)Language-Integrated Query (LINQ) sono disponibili due operatori join, Join e GroupJoin.The LINQ (Language-Integrated Query)Language-Integrated Query (LINQ) framework provides two join operators, Join and GroupJoin. Questi operatori eseguono equijoin:, ovvero join che corrispondono a dati di due origini solo quando le chiavi sono uguali.These operators perform equi-joins: that is, joins that match two data sources only when their keys are equal. Al contrario, in Transact-SQLTransact-SQL sono supportati operatori di join diversi da equals, ad esempio l'operatore less than.(By contrast, Transact-SQLTransact-SQL supports join operators other than equals, such as the less than operator.)

In termini di database relazionale, il metodo Join implementa un inner join.In relational database terms, Join implements an inner join. Un inner join è un tipo di join in cui vengono restituiti solo gli oggetti che dispongono di una corrispondenza nel set di dati opposto.An inner join is a type of join in which only those objects that have a match in the opposite data set are returned.

Il GroupJoin operatori hanno un equivalente diretto in termini di database relazionale, ma implementano un superset di inner join e left outer join.The GroupJoin operators have no direct equivalent in relational database terms; they implement a superset of inner joins and left outer joins. Un left outer join è un join che restituisce ogni elemento della prima raccolta (sinistra), anche se non ha elementi correlati nella seconda raccolta.A left outer join is a join that returns each element of the first (left) collection, even if it has no correlated elements in the second collection.

Per ulteriori informazioni sui join, vedere operazioni Join.For more information about joins, see Join Operations.

EsempioExample

Nell'esempio seguente viene eseguito un join tradizionale delle tabelle SalesOrderHeader e SalesOrderDetail del database di esempio AdventureWorks per ottenere gli ordini effettuati online dal mese di agosto.The following example performs a traditional join of the SalesOrderHeader and SalesOrderDetail tables from the AdventureWorks sample database to obtain online orders from the month of August.

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

Vedere ancheSee Also

Esecuzione di query su oggetti DataSetQuerying DataSets
Query su singola tabellaSingle-Table Queries
Esecuzione di query su oggetti DataSet tipizzatiQuerying Typed DataSets
Operazioni di joinJoin Operations
Esempi di LINQ to DataSetLINQ to DataSet Examples