※この投稿はMicrosoft Visual Studio 2008 Beta2で動作を確認しています。
LINQ to SQLではSQL Server上のデータベースに含まれるデータをプログラムから操作することができます。
まずは以下のような内容でPeopleテーブルを作成しました。
次にプロジェクトに新しい項目の追加からLINQ to SQLクラスを追加します。
新たに表示されるページ(LINQTEST.dbml)の左ペインにサーバエクスプローラからPeopleテーブルをドラッグ アンドドロップすると、Peopleクラスが自動的に生成されます。
このページを保存して、自動的に生成されたクラスを確定したうえで、メインのプログラムを記述します。
using System;
using System.Linq;
namespace LINQ4
{
class Program
{
static void Main(string[] args)
{
LINQTESTDataContext dtc = new LINQTESTDataContext();
dtc.Log = Console.Out;
var query = from p in dtc.People
where p.Gender == 1 && p.Age >= 20
orderby p.Age
select p;
foreach (var item in query)
{
Console.WriteLine("名前={0}, 年齢={1}", item.Name, item.Age);
}
Console.Read();
}
}
}
LINQ to SQLで重要になるのは、テーブルをドラッグ アンド ドロップすることで自動的に生成されるDataContextです。
ドラッグ アンド ドロップによりどのようなプログラムコードが自動生成されているかは、LINQ to SQL クラス名.designer.cs ファイルを見ることで確認できます。
このDataContext(上記ではLINQTESTDataContext)に含まれるテーブル(dtc.People)に対してLINQを記述していきます。
LINQ自体の記述はObjectやXMLを対象とした場合とほとんど大差はありません。
拡張メソッドを利用した記述も同じように利用できます。DataContextに含まれるテーブルが操作の対象となる点にだけ気をつけていれば十分です。
var query = dtc.People.Where(p => p.Gender == 1 && p.Age >= 20).OrderBy(p => p.Age);
実行結果は以下のようになります。
この実行結果にSQL文が含まれるのはプログラム中でDataContextのLogプロパティに標準出力(Console.Out)を設定しているためです。
LINQ to SQLのプログラムがパラメータを利用したSQLクエリに変換され、実行されていることがわかります。
このSQLクエリがどのタイミングで実行されるのか、ブレークポイントを指定してデバックを実行して確認してみましょう。
上記のように、LINQの記述の後のforeachにブレークポイントを設定した場合、この時点ではコンソール上にSQL文は表示されません。
F11キーを押して1ステップずつ確認していくと、2ステップ目の以下のタイミングでSQL文がコンソール上に表示されます。
このことにより、LINQの記述でquery変数に直接データが設定されるのではなく、query変数の内容にアクセスしようとしたタイミング(foreach内部)でSQL文が生成/発行され、データが取り出されることが確認できます。