Condividi tramite


Procedura dettagliata: Esecuzione di query tra relazioni (C#)

Questa procedura dettagliata illustra l'uso delle associazioni LINQ to SQL per rappresentare le relazioni di chiave esterna nel database.

Nota

Il computer potrebbe visualizzare nomi o percorsi diversi per alcuni degli elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. L'edizione di Visual Studio disponibile e le impostazioni usate determinano questi elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Questa procedura dettagliata è stata scritta usando le impostazioni di sviluppo di Visual C#.

Prerequisiti

È necessario aver completato Procedura dettagliata: Modello a oggetti semplice e Query (C#). Questa procedura dettagliata si basa sulla precedente, inclusa la presenza del file northwnd.mdf nella cartella c:\linqtest5.

Informazioni generali

Questa procedura dettagliata è costituita da tre attività principali:

  • Aggiunta di una classe di entità per rappresentare la tabella Orders nel database Northwind di esempio.

  • Integrazione delle annotazioni alla classe Customer per migliorare la relazione tra le classi Customer e Order.

  • Creazione ed esecuzione di una query per testare l'acquisizione di informazioni Order usando la classe Customer.

Mappatura delle relazioni tra tabelle

Dopo la definizione della classe Customer, creare la definizione della classe di entità Order che include il codice seguente, che indica che Order.Customer è correlato come chiave esterna a Customer.CustomerID.

Per aggiungere la classe di entità Order

  • Digitare o incollare il codice seguente dopo la classe Customer:

    [Table(Name = "Orders")]
    public class Order
    {
        private int _OrderID = 0;
        private string _CustomerID;
        private EntityRef<Customer> _Customer;
        public Order() { this._Customer = new EntityRef<Customer>(); }
    
        [Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY",
        IsPrimaryKey = true, IsDbGenerated = true)]
        public int OrderID
        {
            get { return this._OrderID; }
            // No need to specify a setter because IsDBGenerated is
            // true.
        }
    
        [Column(Storage = "_CustomerID", DbType = "NChar(5)")]
        public string CustomerID
        {
            get { return this._CustomerID; }
            set { this._CustomerID = value; }
        }
    
        [Association(Storage = "_Customer", ThisKey = "CustomerID")]
        public Customer Customer
        {
            get { return this._Customer.Entity; }
            set { this._Customer.Entity = value; }
        }
    }
    

Annotazione della classe Customer

In questo passaggio si annota la classe Customer per indicare la relazione con la classe Order. Questa aggiunta non è strettamente necessaria, perché la definizione della relazione in entrambe le direzioni è sufficiente per creare il collegamento. Tuttavia, l'aggiunta di questa annotazione consente di spostarsi facilmente tra gli oggetti in entrambe le direzioni.

Per annotare la classe Customer

  • Digitare o incollare il codice seguente nella classe Customer:

    private EntitySet<Order> _Orders;
    public Customer()
    {
        this._Orders = new EntitySet<Order>();
    }
    
    [Association(Storage = "_Orders", OtherKey = "CustomerID")]
    public EntitySet<Order> Orders
    {
        get { return this._Orders; }
        set { this._Orders.Assign(value); }
    }
    

Creazione ed esecuzione di una query nella relazione Customer-Order

È ora possibile accedere ai Order oggetti direttamente dagli oggetti Customer, oppure nell'ordine opposto. Non è necessario un esplicito per partecipare tra clienti e ordini.

Per accedere agli oggetti di tipo Ordine utilizzando oggetti di tipo Cliente

  1. Modificare il metodo Main digitando o incollando il codice seguente nel metodo :

    // Query for customers who have placed orders.
    var custQuery =
        from cust in Customers
        where cust.Orders.Any()
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine("ID={0}, Qty={1}", custObj.CustomerID,
            custObj.Orders.Count);
    }
    
  2. Premere F5 per eseguire il debug dell'applicazione.

    Nota

    È possibile eliminare il codice SQL nella finestra della console commentando db.Log = Console.Out;.

  3. Premere INVIO nella finestra della console per arrestare il debug.

Creazione di una vista fortemente tipizzata del database

È molto più semplice iniziare con una visualizzazione fortemente tipizzata del database. Digitando fortemente l'oggetto DataContext, non è necessario chiamare per GetTable. Puoi usare tabelle fortemente tipizzate in tutte le tue query quando usi l'oggetto DataContext fortemente tipizzato.

Nei passaggi seguenti si creerà Customers come tabella fortemente tipizzata che esegue il mapping alla tabella Customers del database.

Per digitare fortemente l'oggetto DataContext

  1. Aggiungere il codice seguente sopra la dichiarazione di classe Customer.

    public class Northwind : DataContext
    {
        // Table<T> abstracts database details per table/data type.
        public Table<Customer> Customers;
        public Table<Order> Orders;
    
        public Northwind(string connection) : base(connection) { }
    }
    
  2. Modificare il metodo Main per usare il DataContext fortemente tipizzato come indicato di seguito:

    // Use a connection string.
    Northwind db = new Northwind(@"C:\linqtest5\northwnd.mdf");
    
    // Query for customers from Seattle.
    var custQuery =
        from cust in db.Customers
        where cust.City == "Seattle"
        select cust;
    
    foreach (var custObj in custQuery)
    {
        Console.WriteLine($"ID={custObj.CustomerID}");
    }
    // Freeze the console window.
    Console.ReadLine();
    
  3. Premere F5 per eseguire il debug dell'applicazione.

    L'output della finestra della console è:

    ID=WHITC

  4. Premere INVIO nella finestra della console per arrestare il debug.

Passaggi successivi

La procedura dettagliata successiva (Procedura dettagliata: Modifica dei dati (C#)) illustra come modificare i dati. Per questa procedura dettagliata non è necessario salvare le due procedure dettagliate di questa serie già completate.

Vedere anche