LINQ to SQLで抽出と並び替え

※この投稿はMicrosoft Visual Studio 2008 Beta2で動作を確認しています。

LINQ to SQLではSQL Server上のデータベースに含まれるデータをプログラムから操作することができます。
まずは以下のような内容でPeopleテーブルを作成しました。

image

次にプロジェクトに新しい項目の追加からLINQ to SQLクラスを追加します。

LINQ to SQLクラスの追加

新たに表示されるページ(LINQTEST.dbml)の左ペインにサーバエクスプローラからPeopleテーブルをドラッグ アンドドロップすると、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文がコンソール上に表示されます。

2ステップ実行

SQL文表示

このことにより、LINQの記述でquery変数に直接データが設定されるのではなく、query変数の内容にアクセスしようとしたタイミング(foreach内部)でSQL文が生成/発行され、データが取り出されることが確認できます。

公開 06-09-2007 12:45 投稿者 ono
カテゴリ:

コメント

 

どっとねっとふぁんBlog said:

※この投稿はMicrosoft Visual Studio 2008 Beta2で動作を確認しています。
前の投稿ではデータの抽出条件として数字の一致と大小比較を利用しています。抽出条件で数字ではなく文字列を利用したい場合はどのようにすればよいか調べてみます。...
12月 28, 2007 11:33
この投稿に対する新規コメントはできません
SkinName:iroha_Blog2
Powered by Community Server, by Telligent Systems