共用方式為


操作導覽:跨關聯性查詢(C#)

本逐步解說示範如何使用 LINQ to SQL 關聯 來代表資料庫中的外鍵關聯性。

備註

您的電腦可能會在下列指示中顯示某些 Visual Studio 使用者介面元素的不同名稱或位置。 您擁有的 Visual Studio 版本,以及您所使用的設定會決定這些元素。 如需詳細資訊,請參閱 個人化 IDE

本逐步解說是使用 Visual C# 開發設定所撰寫。

先決條件

您必須已完成 逐步解說:簡單物件模型和查詢(C#)。 本逐步解說是以之前提到的逐步解說為基礎,其中包括 c:\linqtest5 資料夾中 northwnd.mdf 檔案的存在。

概觀

本逐步解說包含三個主要任務:

  • 新增實體類別來代表範例 Northwind 資料庫中的 Orders 數據表。

  • 補充 Customer 類別的註釋,以增強 CustomerOrder 類別之間的關聯性。

  • 建立和執行查詢,以測試使用 Customer 類別取得 Order 資訊。

在表格之間建立映射關係

Customer 類別定義之後,建立包含下列程式代碼的 Order 實體類別定義,指出 Order.CustomerCustomer.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 物件

  1. 在 方法中輸入或貼上下列程序代碼,以修改 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);
    }
    
  2. 按 F5 以偵錯您的應用程式。

    備註

    您可以將 db.Log = Console.Out;批注化,以排除主控台視窗中的 SQL 程式代碼。

  3. 在主控台視窗中按 Enter 以停止偵錯。

建立資料庫的嚴格定型視圖

從強型別結構的資料庫視圖開始會更加容易。 藉由強式輸入 DataContext 物件,您不需要呼叫 GetTable。 當您使用強型別 DataContext 物件時,您可以在所有查詢中使用強型別數據表。

在下列步驟中,您將建立 Customers 作為對應到資料庫中 Customers 資料表的強類型數據表。

若要嚴格定義 DataContext 物件的類型

  1. 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) { }
    }
    
  2. 修改 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();
    
  3. 按 F5 以偵錯您的應用程式。

    主控台視窗輸出為:

    ID=WHITC

  4. 在主控台視窗中按 Enter 以停止偵錯。

後續步驟

下一個操作指南(操作指南:操作數據(C#))示範如何操作數據。 該逐步解說不需要您保留在此系列中已完成的兩個逐步解說。

另請參閱

  • 透過逐步解說學習 學習