Leggere in inglese

Condividi tramite


Esempi di sintassi delle espressioni di query: operatori join (LINQ to DataSet)

L'unione è un'operazione importante nelle query destinate a origini dati che non hanno relazioni navigabili tra loro, ad esempio tabelle di database relazionali. Un'unione di due origini dati è l'associazione di oggetti in un'origine di dati con oggetti che condividono un attributo comune nell'altra origine di dati. Per altre informazioni, vedere Panoramica degli operatori di query standard (C#) o Panoramica degli operatori di query standard (Visual Basic).

Negli esempi di questo argomento viene illustrato come usare i metodi GroupJoin e Join per eseguire query su un DataSet usando la sintassi dell'espressione di query.

Il metodo FillDataSet usato in questi esempi è specificato in Caricamento di dati in un dataset.

Gli esempi in questo argomento usano le tabelle Contact, Address, Product, SalesOrderHeader e SalesOrderDetail nel database di esempio AdventureWorks.

Gli esempi in questo argomento usano le istruzioni using/Imports seguenti:

C#
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;

Per altre informazioni, vedere Procedura: Creare un progetto LINQ to DataSet in Visual Studio.

GroupJoin

Esempio

In questo esempio viene eseguita una GroupJoin sulle tabelle SalesOrderHeader e SalesOrderDetail per trovare il numero di ordini per cliente. Un join di gruppo è l'equivalente di un left outer join, che restituisce ogni elemento della prima origine dati (sinistra), anche se nessun elemento correlato si trova nell'altra origine dati.

C#
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

var orders = ds.Tables["SalesOrderHeader"].AsEnumerable();
var details = ds.Tables["SalesOrderDetail"].AsEnumerable();

var query =
    from order in orders
    join detail in details
    on order.Field<int>("SalesOrderID")
    equals detail.Field<int>("SalesOrderID") into ords
    select new
    {
        CustomerID =
            order.Field<int>("SalesOrderID"),
        ords = ords.Count()
    };

foreach (var order in query)
{
    Console.WriteLine($"CustomerID: {order.CustomerID}  Orders Count: {order.ords}");
}

Esempio

Ecco un esempio in cui viene eseguita una GroupJoin sulle tabelle Contact e SalesOrderHeader. Un join di gruppo è l'equivalente di un left outer join, che restituisce ogni elemento della prima origine dati (sinistra), anche se nessun elemento correlato si trova nell'altra origine dati.

C#
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

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

var query =
    from contact in contacts.AsEnumerable()
    join order in orders.AsEnumerable()
    on contact.Field<Int32>("ContactID") equals
    order.Field<Int32>("ContactID")
    select new
    {
        ContactID = contact.Field<Int32>("ContactID"),
        SalesOrderID = order.Field<Int32>("SalesOrderID"),
        FirstName = contact.Field<string>("FirstName"),
        Lastname = contact.Field<string>("Lastname"),
        TotalDue = order.Field<decimal>("TotalDue")
    };

foreach (var contact_order in query)
{
    Console.WriteLine($"ContactID: {contact_order.ContactID} "
                    + "SalesOrderID: {contact_order.SalesOrderID} "
                    + "FirstName: {contact_order.FirstName} "
                    + "Lastname: {contact_order.Lastname} "
                    + "TotalDue: {contact_order.TotalDue}");
}

Unisciti.

Esempio

In questo esempio viene eseguito un join sulle tabelle SalesOrderHeader e SalesOrderDetail per ottenere ordini online del mese di agosto.

C#
// 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}");
}

Vedere anche