はじめての LINQ to SQL

LINQ に興味があるが、まだ触っていない。どうやっていいのかよく分からない、という方を対象としています。
理屈抜きでとにかく動くものを作ってみましょう。自分の手で動かしてみることが理解への第一歩です。



SQL Server 2005 に Northwind、Pubs データベースがインストールされていることを前提とします。
インストールしていない方は
http://msdn2.microsoft.com/ja-jp/library/ms143221.aspx
よりダウンロード。SQL2000SampleDb.msi を実行するとC:\SQL Server 2000 Sample Databases フォルダにMDF ファイルができるので Management Studio または osql コマンドを使ってアタッチしてください。



では始めましょー。
Visual Studio 2008 を立ち上げて、ファイル → 新規作成 → プロジェクト → C# の コンソールアプリケーション を選択。
プロジェクト名は LINQFirst とします。 OK を押す。
ソリューションエクスプローラを右クリック → 追加 → 新しい項目 → LINQ to SQL クラス
ファイル名は Northwind.dbml とします。


ここで現れた画面を「オブジェクト リレーショナルデザイナ」といいます。
表示 → サーバーエクスプローラ でサーバーエクスプローラを表示し、データ接続 接続の追加 でサーバ名を指定、データベース名を Northwind にします。

サーバーエクスプローラに接続が追加されたので + の部分をクリックして展開していきます。テーブルの一覧が表示されるまで展開します。

Products テーブルを画面(オブジェクト リレーショナルデザイナ)にドラッグします。


この画面でやることは以上。次にデータを読み出すプログラムを書いていきます。

ソリューションエクスプローラで program.cs をダブルクリック。

Program クラスのにメソッドを追加。

    public static void Proc1()
      {
          NorthwindDataContext northwind = new NorthwindDataContext();
          var ProductList = from p in northwind.Products
                            where p.CategoryID == 2
                            select p;
          foreach (var val in ProductList)
          {
              Console.WriteLine("{0}:{1}:{2}", val.ProductID, val.ProductName, val.CategoryID);
          }
      }

where 句を書くときに、p. の後でちゃんとインテリセンスが効いていると思います。CategoryID とすべて書かなくても補完してくれるわけです。これがLINQのいいところ。


ちょっと横道にそれます。foreach 句ですが、楽をしましょう。
fore と途中まで入力して、Tab を二回押す。すると括弧まで含めてどかーっと補完されます。この機能をIntellisense コードスニペットといいます。
現在選択中である var の部分が青、そして item、collection の部分が緑色になっています。Tab を押すごとにこの3個所をカーソルが移動します。item の位置にカーソルを移動して、item を val と書き換えて、もう一度 Tab を押して Collection を ProductList と書き換えます。完了したら Enter を押します。するとカーソルが括弧の次の行に移動してくれます。
Console.Writeline は cw の後に Tab 二回です。
このように Intellisense コードスニペット機能を使うとあっというまにコードが書けるのでとても便利です。


最後にProc1を呼び出すため Main 句に追加。

       static void Main(string[] args)
        {
            Proc1();
        }


最終的に Program.csは次のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQFirst
{
    class Program
    {
        static void Main(string[] args)
        {
            Proc1();
        }
        public static void Proc1()
        {
            NorthwindDataContext northwind = new NorthwindDataContext();
            var ProductList = from p in northwind.Products
                              where p.CategoryID == 2
                              select p;
            foreach (var val in ProductList)
            {
                Console.WriteLine("{0}:{1}:{2}", val.ProductID, val.ProductName, val.CategoryID);
            }
            foreach (var val in ProductList)
            {
                Console.WriteLine();
            }
        }
    }
}


では実行してみましょう。ここでひとつ注意。F5 で実行すると、コンソールアプリケーションは実行完了後すぐに閉じてしまいます。これでは結果が見えないので、Ctrl + F5(デバッグなしで開始)で実行しましょう。こうすると画面が閉じません。

はい、Products テーブルのCategoryID が 2のデータが表示されました。おめでとうございます。
簡単すぎて逆に何をやっているのか分からなかったかもしれませんが、なにも難しいことはないのです。これを足がかりに徐々にステップアップしていただければ幸いです。

ステップアップのための参考ページ

日本語のページ

http://www.microsoft.com/japan/msdn/virtuallabs/
の「Visual Studio 2008 ワークショップ : LINQ を活用したデータ アクセス プログラミング」
Visual Studio の仮想環境を提供してくれるので、自分のマシンに Visual Studio が入っていなくても試せます。テキストも親切で非常に分かりやすいです。おすすめです。


説明するまでもない、Scott Guthrie さんのblogの日本語訳。翻訳をされた Chica さんに感謝。
http://www.chica2.dev-asp.net/ScottGu/result.aspx?target=LINQ+to+SQL%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b+(%e3%83%91%e3%83%bc%e3%83%881)+
http://www.chica2.dev-asp.net/ScottGu/result.aspx?target=LINQ+to+SQL+(%e3%83%91%e3%83%bc%e3%83%882+-+%e3%83%87%e3%83%bc%e3%82%bf%e3%83%a2%e3%83%87%e3%83%ab%e3%82%af%e3%83%a9%e3%82%b9%e3%81%ae%e5%ae%9a%e7%be%a9)++
http://www.chica2.dev-asp.net/ScottGu/result.aspx?target=LINQ+to+SQL+(%e3%83%91%e3%83%bc%e3%83%88+3+-+%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ae%e6%a4%9c%e7%b4%a2)+


英語の動画
英語分からなくても動画なのでなんとなく分かるのではないかと。
Scott Guthrie さんによる動画
ScottGu's Blog - Video: Using LINQ with ASP.NET in VS "Orcas" (Part 1)
の、「watch the video online here」または「 .zip version of it here」で圧縮ファイルをダウンロード。


VB.NET の動画が多い。
Data Access | Microsoft Docs


オブジェクト リレーションデザイナを使わないやり方(Product クラスを自前で定義して、[Table]、[Column]属性を付ける)
LINQ – Video 1 av 3 – Johan Lindfors
LINQ to SQL – Video 2 av 3 – Johan Lindfors


20本近くあります
http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/05/10/9322.aspx