チュートリアル : リレーションシップを介したクエリの実行 (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 ファイルがあることが前提です。
概要
このチュートリアルは、主に次の 3 つの手順で構成されています。
エンティティ クラスを追加して、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 の間に、明示的な結合は必要ありません。
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)」) では、データの操作方法について説明します。そのチュートリアルを実行するのに、既に終了したこのシリーズの 2 つのチュートリアルを保存する必要はありません。