演练:跨关系查询 (Visual Basic) (LINQ to SQL)

更新:November 2007

本演练演示如何使用 LINQ to SQL 关联来表示数据库中的外键关系。

说明:

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置

本演练是使用 Visual Basic 开发设置编写的。

先决条件

您必须先完成演练:简单对象模型和查询 (Visual Basic) (LINQ to SQL)。本演练建立在该演练基础之上,包括在 c:\linqtest 中须存在 northwnd.mdf 文件。

概述

本演练由三项主要任务组成:

  • 添加一个实体类以表示 Northwind 示例数据库中的 Orders 表。

  • 向 Customer 类补充一些批注,以增强 Customer 和 Order 类之间的关系。

  • 创建并运行查询以测试通过使用 Customer 类获取 Order 信息的过程。

跨表映射关系

在 Customer 类定义的后面,创建包含如下代码的 Order 实体类定义,这些代码表示 Orders.Customer 作为外键与 Customers.CustomerID 相关。

添加 Order 实体类

  • 在 Customer 类后面键入或粘贴如下代码:

    <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
    

对 Customer 类进行批注

在此步骤中,您要对 Customer 类进行批注,以指示它与 Order 类的关系。(这种添加批注的操作并非绝对必需的,因为定义任一方向上的关系都足以满足创建链接的需要。但添加此批注确实便于您在任一方向上定位对象。)

对 Customer 类进行批注

  • 将下面的代码键入或粘贴到 Customer 类中:

    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
    

跨 Customer-Order 关系创建并运行查询

现在您可以直接从 Customer 对象访问 Order 对象,或反过来进行访问。您不需要在客户和订单之间具有显式联接。

使用 Customer 对象访问 Order 对象

  1. 通过将下面的代码键入或粘贴到 Sub Main 方法中修改此方法:

    ' 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. 按 F5 调试应用程序。

    消息框中会显示两个名称,并且控制台窗口会显示生成的 SQL 代码。

  3. 关闭此消息框以停止调试。

创建数据库的强类型化视图

从数据库的强类型化视图着手要容易得多。通过将 DataContext 对象强类型化,您无需调用 GetTable。当您使用强类型化的 DataContext 对象时,您可以在所有查询中使用强类型化表。

在以下步骤中,您将创建 Customers 作为映射到数据库中的 Customers 表的强类型化表。

对 DataContext 对象进行强类型化

  1. 将下面的代码添加到 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. 将 Sub Main 修改为使用强类型化的 DataContext,如下所示:

    ' 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. 按 F5 调试应用程序。

    控制台窗口输出如下:

    ID=WHITC

  4. 在控制台窗口中按 Enter,以关闭应用程序。

  5. 如果您要保存此应用程序,请在“文件”菜单上单击“全部保存”。

后续步骤

下一演练(演练:操作数据 (Visual Basic) (LINQ to SQL))演示如何操作数据。该演练不要求您保存本系列中已经完成的两个演练的结果。

请参见

概念

通过演练学习 (LINQ to SQL)