Dela via


Genomgång: Fråga mellan relationer (Visual Basic)

Den här genomgången visar hur LINQ till SQL-associationer används för att representera sekundärnyckelrelationer i databasen.

Kommentar

Datorn kan visa olika namn eller platser för vissa av Visual Studio-användargränssnittselementen i följande instruktioner. Den Visual Studio-utgåva som du har och de inställningar som du använder avgör dessa element. Mer information finns i Anpassa IDE.

Den här genomgången skrevs med hjälp av Visual Basic Development Inställningar.

Förutsättningar

Du måste ha slutfört genomgången: Enkel objektmodell och fråga (Visual Basic). Den här genomgången bygger på den, inklusive förekomsten av filen northwnd.mdf i c:\linqtest.

Översikt

Den här genomgången består av tre huvuduppgifter:

  • Lägga till en entitetsklass för att representera tabellen Beställningar i northwind-exempeldatabasen.

  • Komplettera anteckningar till Customer klassen för att förbättra relationen mellan klasserna Customer och Order .

  • Skapa och köra en fråga för att testa processen för att Order hämta information med hjälp Customer av klassen.

Mappa relationer mellan tabeller

Efter klassdefinitionen Customer skapar du entitetsklassdefinitionen Order som innehåller följande kod, vilket anger att Orders.Customer relaterar som en sekundärnyckel till Customers.CustomerID.

Så här lägger du till entitetsklassen Order

  • Skriv eller klistra in följande kod efter Customer klassen:

    <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
    

Kommentera kundklassen

I det här steget kommenterar Customer du klassen för att ange dess relation till Order klassen. (Detta tillägg är inte absolut nödvändigt, eftersom det räcker att definiera relationen i båda riktningarna för att skapa länken. Men om du lägger till den här anteckningen kan du enkelt navigera i objekt i båda riktningarna.)

Så här kommenterar du kundklassen

  • Skriv eller klistra in följande kod i Customer klassen:

    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
    

Skapa och köra en fråga i kundbeställningsrelationen

Nu kan du komma åt Order objekt direkt från objekten Customer eller i motsatt ordning. Du behöver ingen explicit koppling mellan kunder och beställningar.

Så här kommer du åt Order-objekt med hjälp av kundobjekt

  1. Sub Main Ändra metoden genom att skriva eller klistra in följande kod i metoden:

    ' 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. Tryck på F5 för att felsöka programmet.

    Två namn visas i meddelanderutan och konsolfönstret visar den genererade SQL-koden.

  3. Stäng meddelanderutan för att sluta felsöka.

Skapa en starkt typad vy av databasen

Det är mycket enklare att börja med en starkt skriven vy av databasen. Genom att DataContext starkt skriva objektet behöver du inte anrop till GetTable. Du kan använda starkt skrivna tabeller i alla dina frågor när du använder det starkt skrivna DataContext objektet.

I följande steg skapar Customers du som en starkt skriven tabell som mappar till tabellen Kunder i databasen.

Så här skriver du datacontextobjektet

  1. Lägg till följande kod ovanför klassdeklarationen 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
    
  2. Ändra Sub Main om du vill använda de starkt inskrivna DataContext på följande sätt:

    ' 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. Tryck på F5 för att felsöka programmet.

    Konsolfönstrets utdata är:

    ID=WHITC

  4. Tryck på Retur i konsolfönstret för att stänga programmet.

  5. På Arkiv-menyn klickar du på Spara alla om du vill spara det här programmet.

Nästa steg

Nästa genomgång (genomgång: Manipulera data (Visual Basic)) visar hur du manipulerar data. Den här genomgången kräver inte att du sparar de två genomgångarna i den här serien som du redan har slutfört.

Se även