演练:简单对象模型和查询(C#)

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

本演练是设计面向代码的,可帮助显示 LINQ to SQL 概念。 通常,你将使用对象关系设计器创建对象模型。

注释

计算机可能会在以下说明中显示某些 Visual Studio 用户界面元素的不同名称或位置。 你拥有的 Visual Studio 版本以及所使用的设置决定了这些元素。 有关更多信息,请参阅 自定义 IDE

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

先决条件

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

  • 本演练需要 Northwind 示例数据库。 如果开发计算机上没有此数据库,可以从Microsoft下载站点下载它。 有关说明,请参阅 下载示例数据库。 下载数据库后,将文件复制到 c:\linqtest5 文件夹。

概述

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

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

  • 将类映射到数据库表。

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

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

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

  • 执行查询并观察结果。

创建 LINQ to SQL 解决方案

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

创建 LINQ to SQL 解决方案

  1. 在 Visual Studio 文件 菜单上,指向 “新建”,然后单击“ 项目”。

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

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

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

  5. “位置” 框中,验证要存储项目文件的位置。

  6. 单击 “确定”

添加 LINQ 引用和指令

本演练用到默认情况下您的项目中可能未安装的程序集。 如果项目中未将 System.Data.Linq 列为引用(展开解决方案资源管理器中的“引用”节点),请添加它,如以下步骤中所述。

添加 System.Data.Linq

  1. 解决方案资源管理器中,右键点击引用,然后点击添加引用

  2. 在“ 添加引用 ”对话框中,单击 .NET,单击 System.Data.Linq 程序集,然后单击“ 确定”。

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

  3. Program.cs顶部添加以下指令:

    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    

将类映射到数据库表

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

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

  • 将以下代码键入或粘贴到Program.cs紧靠在Program类声明上方的位置:

    [Table(Name = "Customers")]
    public class Customer
    {
    }
    

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

在此步骤中,你将完成多个任务。

  • 使用 ColumnAttribute 特性来指定实体类中的 CustomerIDCity 属性,以表示数据库表中的列。

  • 指定 CustomerID 属性为数据库中的主键列。

  • 为专用存储指定 _CustomerID_City 字段。 然后,LINQ to SQL 可以直接存储和检索值,而不是使用可能包含业务逻辑的公共访问器。

表示两个数据库列的特征

  • 请在Program.cs中的Customer类的大括号内键入或粘贴以下代码。

    private string _CustomerID;
    [Column(IsPrimaryKey=true, Storage="_CustomerID")]
    public string CustomerID
    {
        get
        {
            return this._CustomerID;
        }
        set
        {
            this._CustomerID = value;
        }
    }
    
    private string _City;
    [Column(Storage="_City")]
    public string City
    {
        get
        {
            return this._City;
        }
        set
        {
            this._City=value;
        }
    }
    

指定与 Northwind 数据库的连接

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

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

指定数据库连接

  • 将以下代码键入或粘贴到方法中 Main

    请注意,假设 northwnd.mdf 文件位于 linqtest5 文件夹中。 有关详细信息,请参阅本演练前面的先决条件部分。

    // Use a connection string.
    DataContext db = new DataContext
        (@"c:\linqtest5\northwnd.mdf");
    
    // Get a typed table to run queries.
    Table<Customer> Customers = db.GetTable<Customer>();
    

创建简单查询

在此步骤中,你将创建一个查询,以查找数据库 Customers 表中的哪些客户位于伦敦。 此步骤中的查询代码只是描述查询。 它不执行查询。 此方法称为 延迟执行。 有关详细信息,请参阅 LINQ 查询简介 (C#)

你还将生成日志输出,以显示 LINQ to SQL 生成的 SQL 命令。 此日志记录功能(使用 Log)有助于调试,并确定要发送到数据库的命令准确表示查询。

创建简单查询

  • Main声明后,将以下代码键入或粘贴到Table<Customer>方法中。

    // Attach the log to show generated SQL.
    db.Log = Console.Out;
    
    // Query for customers in London.
    IQueryable<Customer> custQuery =
        from cust in Customers
        where cust.City == "London"
        select cust;
    

执行查询

在此步骤中,您将实际执行查询。 在之前步骤中创建的查询表达式只有在需要结果时才会被评估。 开始 foreach 迭代时,将针对数据库执行 SQL 命令,并具体化对象。

执行查询

  1. 在方法末尾 Main 键入或粘贴以下代码(查询说明之后)。

    foreach (Customer cust in custQuery)
    {
        Console.WriteLine("ID={0}, City={1}", cust.CustomerID,
            cust.City);
    }
    
    // Prevent console window from closing.
    Console.ReadLine();
    
  2. 按 F5 键调试应用程序。

    注释

    如果应用程序生成运行时错误,请参阅 演练学习的“故障排除”部分。

    控制台窗口中的查询结果应如下所示:

    ID=AROUT, City=London

    ID=BSBEV, City=London

    ID=CONSH, City=London

    ID=EASTC, City=London

    ID=NORTS, City=London

    ID=SEVES, City=London

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

后续步骤

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

如果要执行跨关系查询演练,请确保保存刚刚完成的演练的解决方案,这是先决条件。

另请参阅