TOPシステム開発> 第2回:LINQによるデータアクセス実装 (3/3)

次世代データアクセステクノロジー

次世代データアクセステクノロジー

第2回:LINQによるデータアクセス実装

著者:マイクロソフト  小高 太郎

公開日:2008/1/15(火)

データの取得

次にプログラムを記述してみよう。まず、前述のtitlesテーブルを取得する例を紹介する(リスト3)。

pubsDataContextは前述のdbmlを元にしたクラスである。ここに定義したエンティティのクラスが作成され、データ(つまりコレクションオブジェクト)がセットされている。

varの後にあるtitlesは、結果セットが入る変数である。LINQでは結果をセットするクラスがその都度変わることが考えられるため、このように型の推論であるvarを用いて変数を用意する。

また、from t inの後にあるpubs.titlesは、クエリーの対象であるコレクションオブジェクトだ。このコレクションオブジェクトに対してwhere(コレクションオブジェクトの絞り込み)やorderby(コレクションオブジェクトの並びかえ)を適用していく。

リスト3:titlesテーブルの取得
static void Main(string[] args)
{
    using(pubsDataContext pubs = new pubsDataContext())
    {
        var titles = from t in pubs.titles
                  where t.type == "business"
                  orderby t.title_id descending
                  select t;

        foreach(var title in titles)
Console.WriteLine(title);
    }
}

リスト4:selectを用いた列の指定
static void Main(string[] args)
{
    using(pubsDataContext pubs = new pubsDataContext())
    {
        var titles = from t in pubs.titles
                  where t.type == "business"
                  orderby t.title_id descending
                  select new
                  {
                    t.title_id,
                    t.title1,
                  };

        foreach(var title in titles)
Console.WriteLine(title);
    }
}

リスト5:LINQの別表現(ラムダ式)
IEnumerable<title> titles = pubs.titles
                    .Where(t => t.type == "business")
                        .OrderBy(t => t.title_id);

リスト6:titlesテーブルとpublisherテーブルの結合
static void Main(string[] args)
{
    using(pubsDataContext pubs = new pubsDataContext())
    {
        var titles = from t in pubs.titles
                  where t.type == "business"
                  orderby t.title_id descending
                  select new
                  {
                    t.title_id,
                    t.title1,
                    t.publisher.pub_name
                  };

        foreach(var title in titles)
Console.WriteLine(title);
    }
}


selectの使用

selectで取得する列を変更(特定)する場合、結果セットの型が変わる可能性があるため、リスト4のようにselectの後にnewを記述することで「匿名型を用いた匿名オブジェクト」を作成する。前述のvarは、この匿名オブジェクトを受けるために用いられる。

またLINQの別表現としてリスト5のような記述方法がある。この中のWhere演算子やOrderBy演算子の引数はラムダ式と呼ばれるが、ラムダ式は.Net FrameworkのCommon Langage Runtimeで定義されるデリゲートに似た構文であり、LINQのクエリ機能はこのラムダ式の概念を基に形成されている。

.NET Frameworkに対する言語拡張とLINQの関係が知りたい方は、「LINQプロジェクトをサポートする言語機能
http://www.microsoft.com/japan/msdn/net/bb308959.aspx
#linqoverview_topic3
)を確認してほしい。

関連をもったテーブルのクエリー

次に、関連をもったテーブルのデータを取得する例を紹介しよう。例えばtitlesテーブルと共にpublisherテーブルのpub_nameを結果セットとして表現したい場合、通常SQL文ではJoin句を使用して結合を用いるであろう。しかしLINQではリスト6のプログラムのように表現することができる。

またLINQは、関連のないテーブル同士でもJoinを使用することで結合を行いデータを、取得することが可能である。

LINQはさまざまなデータソースを対象とすることができる。そこで次回は今回の続きとして「追加」「更新」「削除」などのデータ操作を行う方法を解説した後、メモリ内部のコレクションオブジェクトを対象とする「LINQ to Object」の機能や、XMLを検索できる「LINQ to Xml」の機能をについて解説していく。


前のページ  1  2  3


マイクロソフト株式会社 小高 太郎
著者プロフィール
マイクロソフト株式会社  小高 太郎
ERP パッケージ開発に携わり、プログラマーからスタート。Microsoft Universityの講師を兼務、その後、SE、PM、管理職の道に進むも、縁あって2007年3月よりデベロッパー エバンジェリストに転身、現在は開発者向けに様々な技術訴求を行うべく活動中。


INDEX
第2回:LINQによるデータアクセス実装
  開発の視点でみるLINQ
  開発環境の準備
データの取得