演练:简单对象模型和查询 (C#) (LINQ to SQL)
更新:November 2007
本演练提供了复杂性最小的基本端对端 LINQ to SQL 方案。您将创建一个可为示例 Northwind 数据库中的 Customers 表建模的实体类。然后您将创建一个简单查询,用于列出位于伦敦的客户。
本演练在设计上是面向代码的,以帮助说明 LINQ to SQL 概念。一般来说,您会使用 对象关系设计器 来创建对象模型。对象关系设计器(O/R 设计器)
对象关系设计器(O/R 设计器)
对象关系设计器(O/R 设计器)
![]() |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。 |
本演练是使用 Visual C# 开发设置编写的。
先决条件
本演练使用专用文件夹(“c:\linqtest5”)来保存文件。请在开始本演练前创建此文件夹。
此演练需要 Northwind 示例数据库。如果您的开发计算机上没有此数据库,您可以从 Microsoft 下载网站下载它。有关说明,请参见下载示例数据库 (LINQ to SQL)。下载此数据库后,请将文件复制到 c:\linqtest5 文件夹。
概述
本演练由六项主要任务组成:
在 Visual Studio 中创建 LINQ to SQL 解决方案。
将类映射到数据库表。
在类上指定属性,用于表示数据库列。
指定与 Northwind 数据库的连接。
创建针对该数据库运行的简单查询。
执行查询并观察结果。
创建 LINQ to SQL 解决方案
此任务为第一项任务,在此任务中,您要创建一个 Visual Studio 解决方案,此解决方案包含生成和运行 LINQ to SQL 项目所必需的引用。
创建 LINQ to SQL 解决方案
在 Visual Studio 的“文件”菜单上指向“新建”,然后单击“项目”。
在“新建项目”对话框的“项目类型”窗格中,单击“Visual C#”。
在“模板”窗格中,单击“控制台应用程序”。
在“名称”框中键入 LinqConsoleApp。
在“位置”框中,确认要用于存储项目文件的位置。
单击“确定”。
添加 LINQ 引用和指令
本演练用到默认情况下您的项目中可能未安装的程序集。如果在您的项目中未将 System.Data.Linq 作为引用列出(在“解决方案资源管理器”中展开“引用”节点),请按照以下步骤中的说明添加它。
添加 System.Data.Linq
在“解决方案资源管理器”中,右击“引用”,然后单击“添加引用”。
在“添加引用”对话框中,依次单击“.NET”、System.Data.Linq 程序集和“确定”。
此程序集即被添加到项目中。
在“Program.cs”的顶部添加以下指令:
using System.Data.Linq; using System.Data.Linq.Mapping;
将类映射到数据库表
在此步骤中,您将创建一个类,并将其映射到数据库表。这样的类称为“实体类”。请注意,只需添加 TableAttribute 属性即可实现映射。Name 属性指定数据库中的表的名称。
创建一个实体类并将其映射到数据库表
将下面的代码键入或粘贴到 Program.cs 中紧靠在 Program 类声明上方的位置:
[Table(Name = "Customers")] public class Customer { }
在类中指定用于表示数据库列的属性
您将在此步骤中完成多项任务。
使用 ColumnAttribute 属性在实体类上指定 CustomerID 和 City 属性,用于表示数据库表中的列。
指定 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 是用于从数据库检索对象和提交更改的主要通道。
您还可以针对数据库中的 Customers 表声明 Table<Customer> 作为查询的类型化逻辑表。您将在后续步骤中创建和执行这些查询。
指定数据库连接
将下面的代码键入或粘贴到 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 查询介绍。
您还将生成一个日志输出,用于显示 LINQ to SQL 生成的 SQL 命令。此日志记录功能(使用 Log)在调试过程中可以提供帮助,并有助于确定发送到数据库的命令是否准确地表示您的查询。
创建简单查询
将下面的代码键入或粘贴到 Table<Customer> 声明后面的 Main 方法中。
// 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 命令,并将对象具体化。
执行查询
将下面的代码键入或粘贴到 Main 方法的末尾(在查询说明之后)。
foreach (Customer cust in custQuery) { Console.WriteLine("ID={0}, City={1}", cust.CustomerID, cust.City); } // Prevent console window from closing. Console.ReadLine();
按 F5 调试该应用程序。
说明:
如果您的应用程序产生运行时错误,请参见 通过演练学习 (LINQ to SQL) 中的“疑难解答”一节。
控制台窗口中的查询结果应显示如下:
ID=AROUT, City=London
ID=BSBEV, City=London
ID=CONSH, City=London
ID=EASTC, City=London
ID=NORTS, City=London
ID=SEVES, City=London
在控制台窗口中按 Enter 以关闭应用程序。
后续步骤
演练:跨关系查询 (C#) (LINQ to SQL) 主题将从本演练结束的位置继续。“跨关系查询”演练演示 LINQ to SQL 如何跨表查询,如同关系数据库中的联接。
如果您希望进行“跨关系查询”演练,请务必保存您刚完成演练的解决方案,这是“跨关系查询”演练的前提条件。