Procedura dettagliata: Eseguire query tra relazioni (Visual Basic)

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

Nota

Nomi o percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti potrebbero essere diversi nel computer in uso. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per altre informazioni, vedere Personalizzazione dell'IDE.

Questa procedura dettagliata è stata scritta usando Impostazioni di sviluppo di Visual Basic.

Prerequisiti

È necessario aver completato Procedura dettagliata: Modello a oggetti semplice e query (Visual Basic). Questa procedura dettagliata si basa su tale procedura dettagliata, inclusa la presenza del file northwnd.mdf in c:\linqtest.

Panoramica

La procedura dettagliata è costituita da tre attività principali:

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

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

  • Creazione ed esecuzione di una query per testare il processo per ottenere informazioni su Order usando la classe Customer.

Esecuzione del mapping delle relazioni tra tabelle

Dopo la definizione della classe Customer, creare la definizione della classe di entità Order includendo il codice seguente per indicare che Orders.Customer è correlata come chiave esterna a Customers.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 _OrderID As Integer
        Private _CustomerID As String
        Private _Customers As EntityRef(Of Customer)
    
        Public Sub New()
            Me._Customers = New EntityRef(Of Customer)()
        End Sub
    
        <Column(Storage:="_OrderID", DbType:="Int NOT NULL IDENTITY", _
            IsPrimaryKey:=True, IsDBGenerated:=True)> _
        Public ReadOnly Property OrderID() As Integer
            Get
                Return Me._OrderID
            End Get
        End Property
        ' No need to specify a setter because IsDBGenerated is true.
    
        <Column(Storage:="_CustomerID", DbType:="NChar(5)")> _
        Public Property CustomerID() As String
            Get
                Return Me._CustomerID
            End Get
            Set(ByVal value As String)
                Me._CustomerID = value
            End Set
        End Property
    
        <Association(Storage:="_Customers", ThisKey:="CustomerID")> _
        Public Property Customers() As Customer
            Get
                Return Me._Customers.Entity
            End Get
            Set(ByVal value As Customer)
                Me._Customers.Entity = value
            End Set
        End Property
    End Class
    

Annotazione della classe Customer

In questo passaggio vengono aggiunte annotazioni alla classe Customer per indicare la relazione alla classe Order. Questa aggiunta non è strettamente necessaria, perché la definizione della relazione in entrambe le direzioni è sufficiente per creare il collegamento. L'aggiunta di questa annotazione consente tuttavia 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 _Orders As EntitySet(Of Order)
    
    Public Sub New()
        Me._Orders = New EntitySet(Of Order)()
    End Sub
    
    <Association(Storage:="_Orders", OtherKey:="CustomerID")> _
    Public Property Orders() As EntitySet(Of Order)
        Get
            Return Me._Orders
        End Get
        Set(ByVal value As EntitySet(Of Order))
            Me._Orders.Assign(value)
        End Set
    End Property
    

Creazione ed esecuzione di un query sulla relazione Customer-Order

A questo punto è possibile accedere direttamente agli oggetti Order dagli oggetti Customer o viceversa. Non è necessario un join esplicito tra clienti e ordini.

Per accedere agli oggetti Order usando oggetti Customer

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

    ' Query for customers who have no orders.
    Dim custQuery = _
        From cust In Customers _
        Where Not cust.Orders.Any() _
        Select cust
    
    Dim msg As String = "", title As String = _
        "Customers With No Orders", response As MsgBoxResult, _
        style As MsgBoxStyle = MsgBoxStyle.Information
    
    For Each custObj In custQuery
        msg &= String.Format(custObj.CustomerID & vbCrLf)
    Next
    response = MsgBox(msg, style, title)
    
  2. Premere F5 per eseguire il debug dell'applicazione.

    Nella finestra di messaggio vengono visualizzati due nomi, mentre nella finestra della console viene riportato il codice SQL generato.

  3. Chiudere la finestra di messaggio per interrompere il debug.

Creazione di una visualizzazione fortemente tipizzata del database

È molto più facile iniziare con una visualizzazione fortemente tipizzata del database. Applicando la tipizzazione forte all'oggetto DataContext, si eviterà di eseguire chiamate a GetTable. Quando si usa l'oggetto fortemente tipizzato DataContext, è possibile usare tabelle fortemente tipizzate in tutte le query.

Nei passaggi seguenti si creerà Customers come tabella fortemente tipizzata mappata alla tabella Customers nel database.

Per tipizzare fortemente l'oggetto DataContext

  1. Aggiungere il codice riportato di seguito sopra la dichiarazione della classe Customer.

    Public Class Northwind
        Inherits DataContext
        ' Table(Of T) abstracts database details  per
        ' table/data type.
        Public Customers As Table(Of Customer)
        Public Orders As Table(Of Order)
    
        Public Sub New(ByVal connection As String)
            MyBase.New(connection)
        End Sub
    End Class
    
  2. Modificare Sub Main per usare l'oggetto fortemente tipizzato DataContext come segue:

    ' Use a connection string.
    Dim db As New Northwind _
        ("C:\linqtest\northwnd.mdf")
    
    ' Query for customers from Seattle.
    Dim custs = _
        From cust In db.Customers _
        Where cust.City = "Seattle" _
        Select cust
    
    For Each custObj In custs
        Console.WriteLine("ID=" & custObj.CustomerID)
    Next
    
    ' Freeze the console window.
    Console.ReadLine()
    
  3. Premere F5 per eseguire il debug dell'applicazione.

    L'output nella finestra della console sarà:

    ID=WHITC

  4. Premere INVIO nella finestra Console per chiudere l'applicazione.

  5. Scegliere Salva tutto dal menuFile per salvare l'applicazione.

Passaggi successivi

La procedura dettagliata successiva (Procedura dettagliata: Modifica dei dati (Visual Basic)) illustra come modificare i dati. Per tale procedura dettagliata non è necessario avere salvato le due procedure dettagliate di questa serie già completate.

Vedi anche