連載
» 2007年08月24日 09時30分 公開

Microsoft Tech・Ed 2007 Yokohama Report:LINQってどんなもの?

データアクセスの新しい手法である「LINQ」。いったいどのようなものなのだろうか。これから数回に分けて、LINQの使い方やさまざまな特徴について解説していく。

[下村恭(ハンズシステム),ITmedia]

 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 LINQの全体構成図。図中央のLINQ to SQLなどのLINQプロバイダという仕組みによって、データフォーマットに依存しないクエリを実現する(Tech・ED 2007 Yokohama:Visual Studio 2008におけるVisual C#の新機能 Microsoft Corporation Visual C# Senior Test Lead 波村大悟氏のセッションより)

 今のところ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.

注目のテーマ