チュートリアル: リレーションシップを介したクエリの実行 (C#)

このチュートリアルでは、LINQ to SQL の associations を使用してデータベース内の外部キー リレーションシップを表現する方法について説明します。

注意

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「IDE をカスタマイズする」をご覧ください。

このチュートリアルは、Visual C# 開発設定を使用して記述されています。

必須コンポーネント

チュートリアル:簡単なオブジェクト モデルとクエリ (C#)」を終了している必要があります。 このチュートリアルは前のチュートリアルに基づいて作成されており、c:\linqtest5 に northwnd.mdf ファイルがあることが前提です。

概要

このチュートリアルは、主に次の 3 つの手順で構成されています。

  • エンティティ クラスを追加して、Northwind サンプル データベース内の Orders テーブルを表します。

  • Customer クラスに注釈を付けて、Customer クラスと Order クラス間のリレーションシップを強化します。

  • クエリを作成および実行して、Order クラスによる Customer 情報の取得をテストします。

テーブル間のリレーションシップを指定する

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 リレーションシップ間のクエリを作成および実行する

Order オブジェクトから Customer オブジェクトに、またはその逆の順序で、直接アクセスできます。 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 キーを押して、アプリケーションをデバッグします。

    Note

    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={0}", custObj.CustomerID);
    }
    // Freeze the console window.
    Console.ReadLine();
    
  3. F5 キーを押して、アプリケーションをデバッグします。

    コンソール ウィンドウの出力は次のとおりです。

    ID=WHITC

  4. コンソール ウィンドウで Enter キーを押して、デバッグを停止します。

次の手順

次のチュートリアル (チュートリアル:データの操作 (C#)) では、データの操作方法について説明します。 そのチュートリアルを実行するのに、既に終了したこのシリーズの 2 つのチュートリアルを保存する必要はありません。

関連項目