操作導覽:跨關聯性查詢(C#)
本逐步解說示範如何使用 LINQ to SQL 關聯 來代表資料庫中的外鍵關聯性。
備註
您的電腦可能會在下列指示中顯示某些 Visual Studio 使用者介面元素的不同名稱或位置。 您擁有的 Visual Studio 版本,以及您所使用的設定會決定這些元素。 如需詳細資訊,請參閱 個人化 IDE。
本逐步解說是使用 Visual C# 開發設定所撰寫。
先決條件
您必須已完成 逐步解說:簡單物件模型和查詢(C#)。 本逐步解說是以之前提到的逐步解說為基礎,其中包括 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
類別,以指出其與 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={custObj.CustomerID}"); } // Freeze the console window. Console.ReadLine();
按 F5 以偵錯您的應用程式。
主控台視窗輸出為:
ID=WHITC
在主控台視窗中按 Enter 以停止偵錯。
後續步驟
下一個操作指南(操作指南:操作數據(C#))示範如何操作數據。 該逐步解說不需要您保留在此系列中已完成的兩個逐步解說。
另請參閱
- 透過逐步解說學習 學習