演练:跨关系查询 (C#) (LINQ to SQL)
更新:November 2007
本演练演示如何使用 LINQ to SQL 关联来表示数据库中的外键关系。
说明: |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。 |
本演练是使用 Visual C# 开发设置编写的。
先决条件
您必须已完成 演练:简单对象模型和查询 (C#) (LINQ to SQL)。本演练建立在该演练基础之上,包括在 c:\linqtest5 中须存在 northwnd.mdf 文件。
概述
本演练由三项主要任务组成:
添加一个实体类以表示 Northwind 示例数据库中的 Orders 表。
向 Customer 类补充一些批注,以增强 Customer 和 Order 类之间的关系。
创建并运行查询以测试能否通过使用 Customer 类获取 Order 信息。
跨表映射关系
在 Customer 类定义的后面,创建包含如下代码的 Order 实体类定义,这些代码表示 Order.Customer 作为外键与 Customer.CustomerID 相关。
添加 Order 实体类
在 Customer 类后面键入或粘贴如下代码:
[Table(Name = "Orders")] public class Order { private int _OrderID = 0; private string _CustomerID; private EntityRef<Customer> _Customer; public Order() { this._Customer = new EntityRef<Customer>(); } [Column(Storage = "_OrderID", DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] public int OrderID { get { return this._OrderID; } // No need to specify a setter because IsDBGenerated is // true. } [Column(Storage = "_CustomerID", DbType = "NChar(5)")] public string CustomerID { get { return this._CustomerID; } set { this._CustomerID = value; } } [Association(Storage = "_Customer", ThisKey = "CustomerID")] public Customer Customer { get { return this._Customer.Entity; } set { this._Customer.Entity = value; } } }
对 Customer 类进行批注
在此步骤中,您要对 Customer 类进行批注,以指示它与 Order 类的关系。(这种添加批注的操作并非绝对必需的,因为定义任一方向上的关系都足以满足创建链接的需要。但添加此批注确实便于您在任一方向上定位对象。)
对 Customer 类进行批注
将下面的代码键入或粘贴到 Customer 类中:
private EntitySet<Order> _Orders; public Customer() { this._Orders = new EntitySet<Order>(); } [Association(Storage = "_Orders", OtherKey = "CustomerID")] public EntitySet<Order> Orders { get { return this._Orders; } set { this._Orders.Assign(value); } }
跨 Customer-Order 关系创建并运行查询
现在您可以直接从 Customer 对象访问 Order 对象,或反过来进行访问。您不需要在客户和订单之间具有显式联接。
使用 Customer 对象访问 Order 对象
通过将下面的代码键入或粘贴到 Main 方法中修改此方法:
// Query for customers who have placed orders. var custQuery = from cust in Customers where cust.Orders.Any() select cust; foreach (var custObj in custQuery) { Console.WriteLine("ID={0}, Qty={1}", custObj.CustomerID, custObj.Orders.Count); }
按 F5 调试应用程序。
说明: 您可以通过注释掉 db.Log = Console.Out; 来消除控制台窗口中的 SQL 代码。
在控制台窗口中按 Enter,以停止调试。
创建数据库的强类型化视图
从数据库的强类型化视图着手要容易得多。通过将 DataContext 对象强类型化,您无需调用 GetTable。当您使用强类型化的 DataContext 对象时,您可以在所有查询中使用强类型化表。
在以下步骤中,您将创建 Customers 作为映射到数据库中的 Customers 表的强类型化表。
对 DataContext 对象进行强类型化
将下面的代码添加到 Customer 类声明的上方。
public class Northwind : DataContext { // Table<T> abstracts database details per table/data type. public Table<Customer> Customers; public Table<Order> Orders; public Northwind(string connection) : base(connection) { } }
将 Main 方法修改为使用强类型化的 DataContext,如下所示:
// Use a connection string. Northwind db = new Northwind(@"C:\linqtest5\northwnd.mdf"); // Query for customers from Seattle. var custQuery = from cust in db.Customers where cust.City == "Seattle" select cust; foreach (var custObj in custQuery) { Console.WriteLine("ID={0}", custObj.CustomerID); } // Freeze the console window. Console.ReadLine();
按 F5 调试应用程序。
控制台窗口输出如下:
ID=WHITC
在控制台窗口中按 Enter,以停止调试。
后续步骤
下一演练(演练:操作数据 (C#) (LINQ to SQL))演示如何操作数据。该演练不要求您保存本系列中已经完成的两个演练的结果。