演练:简单对象模型和查询 (Visual Basic) (LINQ to SQL)

本演练提供了复杂性最小的基本端对端 LINQ to SQL 方案。您将创建一个可为示例 Northwind 数据库中的 Customers 表建模的实体类。然后您将创建一个简单查询,用于列出位于伦敦的客户。

本演练在设计上是面向代码的,以帮助说明 LINQ to SQL 概念。一般来说,您会使用 对象关系设计器 来创建对象模型。有关更多信息,请参见 对象关系设计器(O/R 设计器)对象关系设计器(O/R 设计器).  

注意注意

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

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

系统必备

  • 本演练使用专用文件夹(“c:\linqtest”)来保存文件。请在开始本演练前创建此文件夹。

  • 本演练需要 Northwind 示例数据库。如果您的开发计算机上没有此数据库,您可以从 Microsoft 下载网站下载它。有关说明,请参见下载示例数据库 (LINQ to SQL)。下载此数据库后,请将文件复制到 c:\linqtest 文件夹。

概述

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

  • 在 Visual Studio 中创建 LINQ to SQL 解决方案。

  • 将类映射到数据库表。

  • 指定类中的属性表示数据库列。

  • 指定到 Northwind 数据库的连接。

  • 创建针对该数据库运行的简单查询。

  • 执行查询并观察结果。

创建 LINQ to SQL 解决方案

此任务为第一项任务,在此任务中,您要创建一个 Visual Studio 解决方案,此解决方案包含生成和运行 LINQ to SQL 项目所必需的引用。

创建 LINQ to SQL 解决方案

  1. 在**“文件”菜单上单击“新建项目”**。

  2. 在**“新建项目”对话框的“项目类型”窗格中,单击“Visual Basic”**。

  3. 在**“模板”窗格中,单击“控制台应用程序”**。

  4. 在**“名称”**框中,键入 LinqConsoleApp。

  5. 单击**“确定”**。

添加 LINQ 引用和指令

本演练用到默认情况下您的项目中可能未安装的程序集。如果在您的项目中未将 System.Data.Linq 作为引用列出(在**“解决方案资源管理器”中单击“显示所有文件”并展开“引用”**节点),请按照以下步骤中的说明添加它。

添加 System.Data.Linq

  1. 在**“解决方案资源管理器”中,右击“引用”,然后单击“添加引用”**。

  2. 在**“添加引用”对话框中,依次单击“.NET”、System.Data.Linq 程序集,再单击“确定”**。

    此程序集即被添加到项目中。

  3. 同样在**“添加引用”对话框中,单击“.NET”,滚动至 System.Windows.Forms 并单击它,然后单击“确定”**。

    此程序集(支持本演练中的消息框)即被添加到项目中。

  4. 在 Module1 上方添加以下指令:

    Imports System.Data.Linq
    Imports System.Data.Linq.Mapping
    Imports System.Windows.Forms
    

将类映射到数据库表

在此步骤中,您将创建一个类,并将其映射到数据库表。这样的类称为“实体类”。请注意,只需添加 TableAttribute 属性即可完成映射。Name 属性指定数据库中的表的名称。

创建一个实体类并将其映射到数据库表

  • 将下面的代码键入或粘贴到 Sub Main 上方紧靠它的 Module1.vb 中。

    <Table(Name:="Customers")> _
    Public Class Customer
    End Class
    

指定类中的属性表示数据库列

在此步骤中,您要完成几项任务。

  • 您要使用 ColumnAttribute 属性 (Attribute) 指定实体类中的 CustomerID 和 City 属性 (Property) 表示数据库表中的列。

  • 您要指定 CustomerID 属性表示数据库中的主键列。

  • 您要指定 _CustomerID 和 _City 字段用作私有存储字段。然后,LINQ to SQL 就可以直接存储和检索值,而不用使用可能包含业务逻辑的公共访问器。

表示两个数据库列的特性

  • 将下面的代码键入或粘贴到 End Class 前面紧靠它的 Module1.vb 中。

    Private _CustomerID As String
    <Column(IsPrimaryKey:=True, Storage:="_CustomerID")> _
    Public Property CustomerID() As String
        Get
            Return Me._CustomerID
        End Get
        Set(ByVal value As String)
            Me._CustomerID = value
        End Set
    End Property
    
    Private _City As String
    <Column(Storage:="_City")> _
    Public Property City() As String
        Get
            Return Me._City
        End Get
        Set(ByVal value As String)
            Me._City = value
        End Set
    End Property
    

指定到 Northwind 数据库的连接

在此步骤中,要使用 DataContext 对象在您基于代码的数据结构和数据库本身之间建立连接。DataContext 是您从数据库中检索对象和提交更改的主要通道。

您还需声明 Table(Of Customer),用作您针对数据库中 Customers 表的查询的逻辑、类型化表。您将在后续步骤中创建和执行这些查询。

指定数据库连接

  • 将下面的代码键入或粘贴到 Sub Main 方法中。

    请注意,假定 northwnd.mdf 文件位于 linqtest 文件夹中。有关更多信息,请参见本演练前面部分的“先决条件”一节。

    ' Use a connection string.
    Dim db As New DataContext _
        ("c:\linqtest\northwnd.mdf")
    
    ' Get a typed table to run queries.
    Dim Customers As Table(Of Customer) = _
        db.GetTable(Of Customer)()
    

创建简单查询

在此步骤中,您将创建一个查询,查找数据库中的 Customers 表内的哪些客户位于伦敦。此步骤中的查询代码只描述查询。它不执行查询。这种方法称为“延迟执行”。有关更多信息,请参见 LINQ 查询简介 (C#)

您还将生成一个日志输出,显示 LINQ to SQL 生成的 SQL 命令。此日志记录功能(使用 Log)对调试有帮助,并有助于确定发送给数据库的命令是否准确地表示您的查询。

创建简单查询

  • 将下面的代码键入或粘贴到 Table(Of Customer) 声明之后的 Sub Main 方法中:

    ' Attach the log to show generated SQL in a console window.
    db.Log = Console.Out
    
    ' Query for customers in London.
    Dim custQuery = _
        From cust In Customers _
        Where cust.City = "London" _
        Select cust
    

执行查询

在此步骤中,您将实际执行查询。您在前面步骤中创建的查询表达式只有在需要结果时才会进行计算。当您开始 For Each 迭代时,将对数据库执行 SQL 命令,并将对象具体化。

执行查询

  1. 将下面的代码键入或粘贴到 Sub Main 方法的结尾(在查询说明之后):

    ' Format the message box.
    Dim msg As String = "", title As String = "London customers:", _
        response As MsgBoxResult, style As MsgBoxStyle = _
        MsgBoxStyle.Information
    
    ' Execute the query.
    For Each custObj In custQuery
        msg &= String.Format(custObj.CustomerID & vbCrLf)
    Next
    
    ' Display the results.
    response = MsgBox(msg, style, title)
    
  2. 按 F5 调试该应用程序。

    注意注意

    如果您的应用程序产生运行时错误,请参见通过演练学习 (LINQ to SQL) 中的“疑难解答”一节。

    消息框会显示一个包含六个客户的列表。控制台窗口会显示生成的 SQL 代码。

  3. 单击**“确定”**关闭该消息框。

    应用程序即会关闭。

  4. 在**“文件”菜单上单击“全部保存”**。

    如果您要继续下一演练,您将需要此应用程序。

后续步骤

演练:跨关系查询 (Visual Basic) (LINQ to SQL) 主题将从本演练结束的位置继续。“跨关系进行查询”演练演示 LINQ to SQL 如何跨表进行查询,这种查询与关系数据库中的联接类似。

如果您希望进行“跨关系进行查询”演练,请务必保存您刚完成的演练的解决方案,这是一项必备条件。

请参见

概念

通过演练学习 (LINQ to SQL)