チュートリアル: 簡単なオブジェクト モデルとクエリ (C#)

このチュートリアルでは、複雑さを最小限に抑えたエンド ツー エンドの LINQ to SQL シナリオを示します。 サンプルの Northwind データベースにある Customers テーブルのモデル化を行うエンティティ クラスを作成します。 次に、住所がロンドンの顧客を表示するための簡単なクエリを作成します。

このチュートリアルでは、LINQ to SQL の考え方を示すために、コード中心の方法をあえて使用しています。 通常は、オブジェクト リレーショナル デザイナーを使用してオブジェクト モデルを作成できます。

注意

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

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

必須コンポーネント

  • このチュートリアルでは、専用フォルダー ("c:\linqtest5") を使用してファイルを保持します。 チュートリアルを開始する前に、このフォルダーを作成してください。

  • このチュートリアルには、Northwind サンプル データベースが必要です。 開発用コンピューターにこのデータベースがない場合は、Microsoft ダウンロード サイトからダウンロードします。 手順については、「サンプル データベースのダウンロード」を参照してください。 データベースをダウンロードしたら、ファイルを c:\linqtest5 フォルダーにコピーします。

概要

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

  • Visual Studio で LINQ to SQL ソリューションを作成します。

  • データベース テーブルにクラスを割り当てます。

  • クラスに対し、データベース列を表すプロパティを指定します。

  • Northwind データベースへの接続を指定します。

  • データベースに対して実行する簡単なクエリを作成します。

  • クエリを実行して結果を観察する。

LINQ to SQL ソリューションを作成する

最初のタスクでは、LINQ to SQL プロジェクトをビルドおよび実行するために必要な参照が含まれる Visual Studio ソリューションを作成します。

LINQ to SQL ソリューションを作成するには

  1. Visual Studio の [ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスの [プロジェクトの種類] ペインで、 [Visual C#] をクリックします。

  3. [テンプレート] ペインの [コンソール アプリケーション] をクリックします。

  4. [名前] ボックスに「LinqConsoleApp」と入力します。

  5. [場所] ボックスで、プロジェクト ファイルを格納する場所を確認します。

  6. [OK] をクリックします。

LINQ の参照とディレクティブを追加する

このチュートリアルで使用するアセンブリは、既定ではプロジェクトにインストールされていない場合があります。 System.Data.Linq がプロジェクトの参照 (ソリューション エクスプローラー[参照] ノードを展開) に表示されていない場合は、以下の手順に従って追加します。

System.Data.Linq を追加するには

  1. ソリューション エクスプローラーで、 [参照設定] を右クリックし、 [参照の追加] をクリックします。

  2. [参照の追加] ダイアログ ボックスで、 [.NET] をクリックし、System.Data.Linq アセンブリをクリックします。次に、 [OK] をクリックします。

    アセンブリがプロジェクトに追加されます。

  3. 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 テーブルから、住所が London の顧客を検索するクエリを作成します。 この手順で作成するクエリ コードは、クエリを指定するだけです。 実行は行いません。 このような方法を "遅延実行" といいます。 詳細については、「LINQ クエリの概要 (C#)」を参照してください。

また、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 コマンドが実行され、オブジェクトが実体化されます。

クエリを実行するには

  1. Main メソッドの末尾 (クエリ指定の後) に次のコードを入力または貼り付けます。

    foreach (Customer cust in custQuery)
    {
        Console.WriteLine("ID={0}, City={1}", cust.CustomerID,
            cust.City);
    }
    
    // Prevent console window from closing.
    Console.ReadLine();
    
  2. F5 キーを押してアプリケーションをデバッグします。

    Note

    アプリケーションで実行時エラーが発生した場合は、「チュートリアルによる学習」のトラブルシューティングのセクションを参照してください。

    クエリの結果は、以下のようにコンソール ウィンドウに表示されます。

    ID=AROUT, City=London

    ID=BSBEV, City=London

    ID=CONSH, City=London

    ID=EASTC, City=London

    ID=NORTS, City=London

    ID=SEVES, City=London

  3. コンソール ウィンドウで Enter キーを押してアプリケーションを終了します。

次の手順

チュートリアル: リレーションシップ間でクエリを実行する (C#)」トピックは、このチュートリアルの終了位置から続行します。 リレーションシップ間でクエリを実行する方法のチュートリアルでは、リレーショナル データベースの "結合" と同じように、複数のテーブルにまたがったクエリを LINQ to SQL で行う方法を説明します。

「リレーションシップ間でクエリを実行する」のチュートリアルに進む場合は、必要条件として、ここで完了したチュートリアルのソリューションを保存しておく必要があります。

関連項目