データの取得
次にプログラムを記述してみよう。まず、前述の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」の機能をについて解説していく。