Procedura dettagliata: eseguire query tra relazioni (Visual Basic)
In questa procedura dettagliata viene descritto l'uso delle associazioni LINQ to SQL per rappresentare relazioni di chiave esterna nel database.
Nota
I nomi o i 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 la Procedura dettagliata: Modello a oggetti e query semplici (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 classiCustomer
eOrder
.Creazione ed esecuzione di una query per testare il processo per ottenere informazioni su
Order
usando la classeCustomer
.
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 usando 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 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
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 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()
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.
Fare clic su Salva tutto nel menu File se si vuole salvare questa 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.