Overzicht: query's uitvoeren op relaties (Visual Basic)
In dit scenario ziet u hoe LINQ naar SQL-koppelingen wordt gebruikt om relaties met refererende sleutels in de database weer te geven.
Notitie
Mogelijk worden op uw computer verschillende namen of locaties weergegeven voor sommige elementen van de Visual Studio-gebruikersinterface in de volgende instructies. De Visual Studio-editie die u hebt en de instellingen die u gebruikt, bepalen deze elementen. Zie Personalizing the IDE (Personalizing the IDE) voor meer informatie.
Deze procedure is geschreven met behulp van Visual Basic Development Instellingen.
Vereisten
U moet een overzicht hebben voltooid: Eenvoudig objectmodel en -query (Visual Basic). Deze procedure bouwt voort op dat bestand, inclusief de aanwezigheid van het northwnd.mdf-bestand in c:\linqtest.
Overzicht
Deze procedure bestaat uit drie hoofdtaken:
Voeg een entiteitsklasse toe om de tabel Orders in de northwind-voorbeelddatabase weer te geven.
Het aanvullen van aantekeningen aan de
Customer
klasse om de relatie tussen deCustomer
enOrder
klassen te verbeteren.Een query maken en uitvoeren om het proces van het verkrijgen
Order
van informatie te testen met behulp van deCustomer
klasse.
Toewijzingsrelaties tussen tabellen
Maak na de Customer
klassedefinitie de definitie van de Order
entiteitsklasse die de volgende code bevat, die aangeeft dat Orders.Customer
deze betrekking heeft op een refererende sleutel.Customers.CustomerID
De entiteitsklasse Order toevoegen
Typ of plak de volgende code na de
Customer
klasse:<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
Aantekeningen toevoegen aan de klantklasse
In deze stap maakt u aantekeningen voor de klasse om de Customer
relatie met de Order
klasse aan te geven. (Deze toevoeging is niet strikt noodzakelijk, omdat het definiƫren van de relatie in beide richtingen voldoende is om de koppeling te maken. Maar door deze aantekening toe te voegen, kunt u eenvoudig door objecten in beide richtingen navigeren.)
Aantekeningen toevoegen aan de klasse Klant
Typ of plak de volgende code in de
Customer
klasse: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
Een query maken en uitvoeren in de klantorderrelatie
U kunt nu rechtstreeks vanuit de Customer
objecten of in omgekeerde volgorde toegang krijgen tot Order
objecten. U hebt geen expliciete deelname tussen klanten en orders nodig.
Toegang krijgen tot Orderobjecten met behulp van klantobjecten
Wijzig de
Sub Main
methode door de volgende code in de methode te typen of te plakken:' 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)
Druk op F5 om fouten in uw toepassing op te sporen.
Er worden twee namen weergegeven in het berichtvak en in het consolevenster wordt de gegenereerde SQL-code weergegeven.
Sluit het berichtvak om de foutopsporing te stoppen.
Een sterk getypte weergave van uw database maken
Het is veel eenvoudiger om te beginnen met een sterk getypte weergave van uw database. Door het DataContext object sterk te typen, hoeft u geen aanroepen te doen GetTable. U kunt sterk getypte tabellen in al uw query's gebruiken wanneer u het sterk getypte DataContext object gebruikt.
In de volgende stappen maakt Customers
u een sterk getypte tabel die is toegewezen aan de tabel Klanten in de database.
Het DataContext-object sterk typen
Voeg de volgende code toe boven de
Customer
klassedeclaratie.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
Wijzig
Sub Main
het gebruik van de sterk getypte DataContext als volgt:' 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()
Druk op F5 om fouten in uw toepassing op te sporen.
De uitvoer van het consolevenster is:
ID=WHITC
Druk op Enter in het consolevenster om de toepassing te sluiten.
Klik in het menu Bestand op Alles opslaan als u deze toepassing wilt opslaan.
Volgende stappen
In het volgende scenario (Walkthrough: Gegevens bewerken (Visual Basic)) ziet u hoe u gegevens bewerkt. Deze procedure vereist niet dat u de twee scenario's in deze reeks die u al hebt voltooid, opslaat.