チュートリアル : 簡単なオブジェクト モデルとクエリ (C#) (LINQ to SQL)
更新 : November 2007
このチュートリアルでは、複雑さを抑えた、LINQ to SQL 全体の基本的なシナリオを示します。サンプルの Northwind データベースにある Customers テーブルのモデル化を行うエンティティ クラスを作成します。次に、住所がロンドンの顧客を表示するための簡単なクエリを作成します。
このチュートリアルでは、LINQ to SQL の考え方を示すために、コード中心の方法をあえて使用しています。通常は、オブジェクト リレーショナル デザイナを使用してオブジェクト モデルを作成できます。詳細についてはオブジェクト リレーショナル デザイナ (O/R デザイナ) およびオブジェクト リレーショナル デザイナー (O/R デザイナー) およびオブジェクト リレーショナル デザイナー (O/R デザイナー)を参照してください。
メモ : |
---|
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。 |
このチュートリアルは、Visual C# 開発設定を使用して記述されています。
前提条件
このチュートリアルでは、専用フォルダ ("c:\linqtest5") を使用してファイルを保持します。チュートリアルを開始する前にこのフォルダを作成してください。
このチュートリアルには、Northwind サンプル データベースが必要です。開発コンピュータにこのデータベースがない場合は、Microsoft ダウンロード サイトからダウンロードします。手順については、「サンプル データベースのダウンロード (LINQ to SQL)」を参照してください。データベースをダウンロードしたら、ファイルを c:\linqtest5 フォルダにコピーします。
概要
このチュートリアルは、主に次の 6 つの手順で構成されています。
Visual Studio で LINQ to SQL ソリューションを作成します。
データベース テーブルにクラスを割り当てます。
クラスに対し、データベース列を表すプロパティを指定します。
Northwind データベースへの接続を指定します。
データベースに対して実行する簡単なクエリを作成します。
クエリを実行し、結果を確認します。
LINQ to SQL ソリューションの作成
最初に、LINQ to SQL プロジェクトをビルドおよび実行するのに必要な参照を含む Visual Studio ソリューションを作成します。
LINQ to SQL ソリューションを作成するには
Visual Studio で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、[Visual C#] をクリックします。
[テンプレート] ペインの [コンソール アプリケーション] をクリックします。
[プロジェクト名] ボックスに「LinqConsoleApp」と入力します。
[場所] ボックスで、プロジェクト ファイルを格納する場所を確認します。
[OK] をクリックします。
LINQ の参照とディレクティブの追加
このチュートリアルで使用するアセンブリは、既定ではプロジェクトにインストールされていない場合があります。System.Data.Linq がプロジェクトの参照 (ソリューション エクスプローラで [参照設定] ノードを展開) に表示されていない場合は、以下の手順に従って追加します。
System.Data.Linq を追加するには
ソリューション エクスプローラで、[参照設定] を右クリックし、[参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスで、[.NET] をクリックし、System.Data.Linq アセンブリをクリックします。次に、[OK] をクリックします。
アセンブリがプロジェクトに追加されます。
Program.cs の冒頭に、次のディレクティブを追加します。
using System.Data.Linq; using System.Data.Linq.Mapping;
データベース テーブルへのクラスの対応付け
この手順では、クラスを作成して、データベース テーブルに対応付けます。このようなクラスをエンティティ クラスと呼びます。対応付けは、TableAttribute 属性を追加するだけで完了します。Name プロパティを使用して、データベースのテーブルの名前を指定します。
エンティティ クラスを作成し、データベース テーブルに対応付けるには
Program.cs の Program クラス宣言の直前に次のコードを入力または貼り付けます。
[Table(Name = "Customers")] public class Customer { }
クラスでのデータベース列を表すプロパティの指定
この手順では、いくつかのタスクを実行します。
ColumnAttribute 属性を使用して、エンティティ クラスの CustomerID プロパティおよび City プロパティを、データベース テーブルの列を表すものとして指定します。
CustomerID プロパティを、データベースの主キー列を表すものとして指定します。
プライベートでの格納用として _CustomerID フィールドおよび _City フィールドを指定します。こうすることで、LINQ to SQL は、ビジネス ロジックを含む場合があるパブリック アクセサを使用せずに、値を直接格納および取得できます。
2 つのデータベース列の特性を指定するには
Program.cs の Customer クラスの中かっこ内に次のコードを入力または貼り付けます。
private string _CustomerID; [Column(IsPrimaryKey=true, Storage="_CustomerID")] public string CustomerID { get { return this._CustomerID; } set { this._CustomerID = value; } } private string _City; [Column(Storage="_City")] public string City { get { return this._City; } set { this._City=value; } } } }
Northwind データベースへの接続の指定
この手順では、DataContext オブジェクトを使用して、コードで作成したデータ構造とデータベース本体との間の接続を確立します。データベースからのオブジェクトの取得や、変更内容の送信では、DataContext を仲介役として使用します。
また、データベースの Customers テーブルに対するクエリ用として、型指定された論理的なテーブルの役割を果たす Table<Customer> を宣言します。これらのクエリの作成と実行は後の手順で行います。
データベース接続を指定するには
Main メソッドに次のコードを入力または貼り付けます。
northwnd.mdf ファイルは、linqtest5 フォルダにあるものとします。詳細については、このチュートリアルの「前提条件」を参照してください。
// Use a connection string. DataContext db = new DataContext (@"c:\linqtest5\northwnd.mdf"); // Get a typed table to run queries. Table<Customer> Customers = db.GetTable<Customer>();
簡単なクエリの作成
ここでは、データベースの Customers テーブルから住所がロンドンの顧客を取得するためのクエリを作成します。この手順で作成するクエリ コードは、クエリを指定するだけです。実行は行いません。このような方法を遅延実行といいます。詳細については、「LINQ クエリの概要」を参照してください。
また、LINQ to SQL が生成した SQL コマンドをログに出力します。Log を使用したこのログ機能は、デバッグに有効で、データベースに送信されたコマンドが目的のクエリを正確に表しているかどうかを確認するのに役立ちます。
簡単なクエリを作成するには
Main メソッドの Table<Customer> 宣言の後に次のコードを入力または貼り付けます。
// Attach the log to show generated SQL. db.Log = Console.Out; // Query for customers in London. IQueryable<Customer> custQuery = from cust in Customers where cust.City == "London" select cust;
クエリの実行
この手順では、実際にクエリを実行します。ここまでの手順で作成したクエリ式は、結果が必要になるまでは評価されません。foreach の反復処理を開始した時点で、データベースに対して SQL コマンドが実行され、オブジェクトが実体化されます。
クエリを実行するには
Main メソッドの末尾 (クエリ指定の後) に次のコードを入力または貼り付けます。
foreach (Customer cust in custQuery) { Console.WriteLine("ID={0}, City={1}", cust.CustomerID, cust.City); } // Prevent console window from closing. Console.ReadLine();
F5 キーを押してアプリケーションをデバッグします。
メモ : アプリケーションでランタイム エラーが発生した場合は、「チュートリアルによる学習 (LINQ to SQL)」のトラブルシューティングのセクションを参照してください。
クエリの結果は、以下のようにコンソール ウィンドウに表示されます。
ID=AROUT, City=London
ID=BSBEV, City=London
ID=CONSH, City=London
ID=EASTC, City=London
ID=NORTS, City=London
ID=SEVES, City=London
コンソール ウィンドウで Enter キーを押してアプリケーションを終了します。
次の手順
このチュートリアルに続く内容が、「チュートリアル : リレーションシップを介したクエリの実行 (C#) (LINQ to SQL)」のトピックにあります。「リレーションシップ間でクエリを実行する」のチュートリアルでは、リレーショナル データベースの結合と同じように、複数のテーブルにまたがったクエリを LINQ to SQL で行う方法を説明します。
「リレーションシップ間でクエリを実行する」のチュートリアルに進む場合は、必要条件として、ここで完了したチュートリアルのソリューションを保存しておく必要があります。