Návod: Dotazování napříč relacemi (Visual Basic)

Tento názorný postup ukazuje použití přidružení LINQ to SQL k reprezentaci relací cizích klíčů v databázi.

Poznámka:

Počítač může v následujících pokynech zobrazit různé názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Edice sady Visual Studio, kterou máte, a nastavení, která používáte, určují tyto prvky. Další informace najdete v tématu Přizpůsobeníintegrovaného vývojového prostředí (IDE).

Tento návod byl napsán pomocí nastavení vývoje jazyka Visual Basic.

Požadavky

Musíte mít dokončený návod: Jednoduchý objektový model a dotaz (Visual Basic). Tento průvodce navazuje na ten předchozí, včetně přítomnosti souboru northwnd.mdf ve složce c:\linqtest.

Přehled

Tento názorný postup se skládá ze tří hlavních úloh:

  • Přidání třídy entity představující tabulku Orders v ukázkové databázi Northwind

  • Doplnění poznámek do třídy Customer, aby se zlepšil vztah mezi třídami Customer a Order.

  • Vytvoření a spuštění dotazu k otestování procesu získávání Order informací pomocí Customer třídy.

Mapování relací mezi tabulkami

Po definici třídy Customer vytvořte definici třídy entity Order, která obsahuje následující kód, který označuje, že Orders.Customer souvisí jako cizí klíč k Customers.CustomerID.

Přidání třídy entity Order

  • Za třídu Customer zadejte nebo vložte následující kód:

    <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
    

Anotace třídy Zákazník

V tomto kroku označíte třídu Customer poznámkami a označíte její vztah k Order třídě. (Tento doplněk není nezbytně nutný, protože definování relace v obou směrech stačí k vytvoření propojení. Přidáním této poznámky ale můžete snadno procházet objekty v obou směrech.)

Anotace třídy Zákazník

  • Do třídy Customer zadejte nebo vložte následující kód:

    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
    

Vytvoření a spuštění dotazu napříč relací Customer-Order

Nyní můžete přistupovat k objektům Order přímo z objektů Customer nebo v opačném pořadí. Nepotřebujete explicitní připojit mezi zákazníky a objednávkami.

Jak získat přístup k objektu Objednávky pomocí objektu Zákazníka

  1. Upravte metodu Sub Main zadáním nebo vložením následujícího kódu do metody:

    ' 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. Stisknutím klávesy F5 můžete ladit aplikaci.

    V okně se zprávou se zobrazí dva názvy a v okně Konzola se zobrazí vygenerovaný kód SQL.

  3. Zavřete okno se zprávou a zastavte ladění.

Vytvoření striktně typovaného zobrazení vaší databáze

Je mnohem jednodušší začít se silně typovaným zobrazením vaší databáze. Důsledným typováním objektu DataContext nepotřebujete volání funkce GetTable. Tabulky silného typu můžete použít ve všech dotazech, když použijete objekt DataContext silného typu.

V následujících krocích vytvoříte Customers jako silně typovanou tabulku, která se mapuje na tabulku Zákazníci v databázi.

Pro přísné typování objektu DataContext

  1. Nad deklaraci třídy Customer přidejte následující kód.

    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. Upravte Sub Main tak, aby používal silně typovaný DataContext následujícím způsobem:

    ' 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. Stisknutím klávesy F5 můžete ladit aplikaci.

    Výstup okna konzoly je:

    ID=WHITC

  4. Stisknutím klávesy Enter v okně konzoly aplikaci zavřete.

  5. V nabídce Soubor klepněte na tlačítko Uložit vše , pokud chcete uložit tuto aplikaci.

Další kroky

Další návod (Návod: Manipulace s daty (Visual Basic)) ukazuje, jak manipulovat s daty. Tento názorný postup nevyžaduje uložení dvou návodů v této řadě, které jste už dokončili.

Viz také