Share via


Exemplarische Vorgehensweise: Beziehungsübergreifendes Abfragen (Visual Basic)

Diese exemplarische Vorgehensweise veranschaulicht die Verwendung von LINQ to SQL-Zuordnungen, um Fremdschlüsselbeziehungen in der Datenbank darzustellen.

Hinweis

Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in den folgenden Anweisungen aufgeführten. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Personalisieren der IDE.

Diese exemplarische Vorgehensweise wurde mithilfe von Visual Basic-Entwicklungseinstellungen geschrieben.

Voraussetzungen

Sie müssen Folgendes abgeschlossen haben: Exemplarische Vorgehensweise: Einfaches Objektmodell und Abfrage (Visual Basic). 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 Beziehung in beide Richtungen ausreicht, um die Verknüpfung zu erstellen. Das Hinzufügen dieser Anmerkung ermöglicht es Ihnen jedoch, in beiden Richtungen auf einfache Weise in Objekte zu 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 keinen expliziten Join zwischen Kunden und Bestellungen.

So greifen Sie mithilfe von Customer-Objekten auf Order-Objekte zu

  1. Ä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)
    
  2. Drücken Sie F5, um die Anwendung zu debuggen.

    Zwei Namen werden im Meldungsfeld angezeigt, und das Konsolenfenster zeigt den generierten SQL-Code an.

  3. 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 DataContext-Objekts benötigen Sie keine Aufrufe von GetTable. 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

  1. 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
    
  2. Ä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()
    
  3. Drücken Sie F5, um die Anwendung zu debuggen.

    Die Ausgabe im Konsolenfenster lautet:

    ID=WHITC

  4. Drücken Sie die EINGABETASTE im Konsolenfenster, um die Anwendung zu schließen.

  5. 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)) veranschaulicht, wie Daten bearbeitet werden. Diese exemplarische Vorgehensweise setzt nicht voraus, dass Sie die beiden in dieser Serie abgeschlossenen exemplarischen Vorgehensweisen speichern.

Siehe auch