Exemplarische Vorgehensweise: Beziehungsübergreifende Abfragen (Visual Basic) (LINQ to SQL)
Aktualisiert: November 2007
Diese exemplarische Vorgehensweise veranschaulicht die Verwendung von LINQ to SQL-Zuordnungen, um Fremdschlüsselbeziehungen in der Datenbank darzustellen.
Hinweis: |
---|
Ihr Computer zeigt für einige der Elemente der Visual Studio-Benutzeroberfläche in der folgenden Anleitung möglicherweise andere Namen oder Standorte an. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Visual Studio-Einstellungen. |
Diese exemplarische Vorgehensweise wurde mithilfe von Visual Basic-Entwicklungseinstellungen geschrieben.
Vorbereitungsmaßnahmen
Sie müssen die Exemplarische Vorgehensweise: Einfaches Objektmodell und Abfrage (Visual Basic) (LINQ to SQL) abgeschlossen haben. Diese exemplarische Vorgehensweise basiert auf diesem Schritt und erfordert die Datei northwnd.mdf im Verzeichnis c:\linqtest.
Übersicht
Diese exemplarische Vorgehensweise umfasst drei Hauptaufgaben:
Hinzufügen einer Entitätsklasse zur Darstellung der Orders-Tabelle in der Beispieldatenbank Northwind.
Ergänzen von Anmerkungen zur Customer-Klasse, um die Beziehung zwischen der Customer-Klasse und der Order-Klasse zu erweitern.
Erstellen und Ausführen einer Abfrage, um das Abrufen von Order-Informationen unter Verwendung der Customer-Klasse zu testen.
Zuordnen von Beziehungen über Tabellen hinweg
Erstellen Sie nach der Definition der Customer-Klasse die Definition der Order-Entitätsklasse, die den folgenden Code enthält. Dieser gibt an, dass Orders.Customer ein Fremdschlüssel zu Customers.CustomerID ist.
So fügen Sie die Order-Entitätsklasse hinzu
Geben Sie den folgenden Code nach der Customer-Klasse ein, oder fügen Sie ihn ein:
<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
Hinzufügen von Anmerkungen zu einer Customer-Klasse
In diesem Schritt fügen Sie der Customer-Klasse Anmerkungen hinzu, um deren Beziehung zur Order-Klasse anzugeben. (Diese Ergänzung ist nicht unbedingt erforderlich, da die Definition der Beziehungen in beide Richtungen zum Erstellen der Verbindung ausreicht. Mithilfe dieser Anmerkung können Sie jedoch leicht in allen Richtungen zwischen den Objekten navigieren.)
So fügen Sie der Customer-Klasse Anmerkungen hinzu
Geben Sie den folgenden Code in die Customer-Klasse ein, oder fügen Sie ihn ein:
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
Erstellen und Ausführen einer Abfrage über die Customer-Order-Beziehung hinweg
Sie können nun direkt auf die Order-Objekte zugreifen, und zwar von den Customer-Objekten aus oder in umgekehrter Richtung. Sie benötigen keine explizite Verknüpfung zwischen Kunden und Bestellungen.
So greifen Sie mithilfe von Customer-Objekten auf Order-Objekte zu
Ändern Sie die Sub Main-Methode durch das Eingeben oder Einfügen des folgenden Codes in die Methode:
' 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)
Drücken Sie F5, um die Anwendung zu debuggen.
Zwei Namen werden im Meldungsfeld angezeigt, und das Konsolenfenster zeigt den generierten SQL-Code an.
Schließen Sie das Meldungsfeld, um das Debuggen zu beenden.
Erstellen einer Datenbankansicht mit strikter Typbindung
Es ist viel leichter, mit einer Datenbankansicht mit strikter Typbindung zu beginnen. Bei strikter Typbindung des GetTable-Objekts benötigen Sie keine Aufrufe von DataContext. Sie können Tabellen mit strikter Typbindung in allen Abfragen verwenden, wenn Sie das DataContext-Objekt mit strikter Typbindung verwenden.
In den folgenden Schritten erstellen Sie Customers als Tabelle mit strikter Typbindung und Zuordnung zur Customers-Tabelle in der Datenbank.
So erstellen Sie die striktre Typbindung für das DataContext-Objekt
Fügen Sie den folgenden Code oberhalb der Deklaration der Customer-Klasse hinzu.
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
Ändern Sie die Sub Main-Methode wie folgt, damit diese den DataContext mit strikter Typbindung verwendet:
' 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()
Drücken Sie F5, um die Anwendung zu debuggen.
Die Ausgabe im Konsolenfenster lautet:
ID=WHITC
Drücken Sie die EINGABETASTE im Konsolenfenster, um die Anwendung zu schließen.
Klicken Sie im Menü Datei auf Alle speichern, wenn Sie diese Anwendung speichern möchten.
Nächste Schritte
Die nächste exemplarische Vorgehensweise (Exemplarische Vorgehensweise: Bearbeiten von Daten (Visual Basic) (LINQ to SQL)) veranschaulicht, wie Daten bearbeitet werden. Diese exemplarische Vorgehensweise setzt nicht voraus, dass Sie die beiden in dieser Serie abgeschlossenen exemplarischen Vorgehensweisen speichern.