Procedura dettagliata: query tra relazioni (Visual Basic) (LINQ to SQL)
In questa procedura dettagliata viene descritto l'utilizzo delle associazioni LINQ to SQL per rappresentare relazioni di chiave esterna nel database.
Nota |
---|
Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio. |
Questa procedura dettagliata è stata scritta utilizzando Impostazioni di sviluppo di Visual Basic.
Prerequisiti
È necessario avere completato la Procedura dettagliata: modello a oggetti e query semplici (Visual Basic) (LINQ to SQL). 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 utilizzando 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, in quanto la definizione della relazione in una direzione è sufficiente per creare il collegamento. Tuttavia aggiungendo l'annotazione sarà possibile 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 creare un join esplicito tra clienti e ordini.
Per accedere agli oggetti Order utilizzando oggetti Customer
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)
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.
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 utilizza l'oggetto fortemente tipizzato DataContext, è possibile utilizzare 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
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
Modificare Sub Main per utilizzare 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()
Premere F5 per eseguire il debug dell'applicazione.
L'output nella finestra della console sarà:
ID=WHITC
Premere INVIO nella finestra Console per chiudere l'applicazione.
Scegliere Salva tutto dal menu File se si desidera salvare questa applicazione.
Passaggi successivi
Nella successiva procedura dettagliata, Procedura dettagliata: modifica dei dati (Visual Basic) (LINQ to SQL), verrà illustrato come modificare i dati. Per tale procedura dettagliata non è necessario avere salvato le due procedure dettagliate di questa serie già completate.
Vedere anche
Concetti
Apprendimento tramite le procedure dettagliate (LINQ to SQL)