データアクセスの新しい手法である「LINQ」。いったいどのようなものなのだろうか。これから数回に分けて、LINQの使い方やさまざまな特徴について解説していく。
Tech・Ed 2007でもさまざまなセッションで取り上げられている、マイクロソフトの新しいテクノロジー「LINQ」は、.NET Framework 3.5の一部を構成しているテクノロジーだ。いったいどのようなものなのだろうか。
LINQとは、Language INtegrated Query(言語統合型クエリ)の略だ。言語統合クエリと聞いてもイメージしづらいが、「C#やVBなどの.NET言語で、SQL Serverをはじめさまざまなデータソースに格納されているデータを、統一的な手法で検索できる」テクノロジーと言えば分かりやすいだろうか。
LINQは、VB.NETやC#といった.NET言語の文法が拡張されることによって、.NET言語の中でクエリが書けるようになる仕組みだ。こうした言語で書かれたクエリを、こちらも拡張されたコンパイラやLINQライブラリが解釈し、アクセスするデータソースに合った「LINQプロバイダ」というものを呼び出す、という仕組みになっている。このため、LINQプロバイダが対応すれば(提供されれば)あらゆる種類のデータに対して、.NET言語からクエリを発行できると言うわけだ。
今のところLINQプロバイダとしては、SQL ServerにアクセスするLINQ to SQL、CLRオブジェクトにアクセスするLINQ to Object、XMLにアクセスするLINQ to XMLなどが用意されている。将来的にはさらに多様なLINQプロバイダが登場することが予想されている。
現在は、プログラムの中でデータにアクセスしてクエリを発行しようとした場合、SQL文を利用するのが一般的だろう。クエリをSQL文で作成し、何らかのミドルウェアを通してデータベースエンジンに渡し、結果のレコードを受け取るという形だ。このとき、作成したSQL文は単なる文字列であるため、Visual Studioの文法チェッカーであるインテリセンスが効かない、コンパイル時にエラーチェックされず実行してみるまでバグが分からない、などの問題が起こってしまう。
ではLINQではどうなるのだろうか。LINQそのものが.NET言語の文法の一部となるため、インテリセンスが利用でき、コンパイル時の型チェックなども行われるため、実行する前にエラーを見つけることができるようになる。
LINQでは、例えば次のような記述をする。
C#の場合:
var authors = from a in pubs.authors
where a.state == "CA"
select a;
VB.NETの場合:
Dim authors = From author in pubs.authors _
Where author.state == "CA" _
Select author
ともに、pubsスキーマにあるauthorsテーブルから、stateがCAのレコードを選択する、という意味である。一見、やや不自然なSQL文のようにも見えるが、SQLを書ける人から見ると何をしたいのかは一目瞭然だろう。これを実行すると、対象となっているデータがSQL Serverにあれば、自動的に生成されたSQL文がLINQ to SQLを通してSQL Serverに渡され、クエリが実行された上で結果が返ってくる。
同様のことを、SQL Serverでない別のデータに対しても行うことができる。例えば、コレクションオブジェクトに格納されているデータに対してクエリをかけることもできるのだ。記述の方法はLINQ to SQLの場合とまったく同じだ。
C#の場合:
var people2 = from p in people
where p.age <=40
select p;
VB.NETの場合:
Dim people2 = From person in people _
Where person.age <= 40 _
Select person
ともに、peopleコレクションにあるデータからageプロパティの値が40以下のデータのみ選択する、という意味である。
このように、データの種類を問わず同じ文法でクエリを発行できるのがLINQだ。しかし、LINQは単なる言語に組み込まれたデータクエリ機能ではない。LINQには壮大な未来が託されているのだ。この点については、次回追ってリポートする。
Copyright © ITmedia, Inc. All Rights Reserved.