LINQ
さて、型推論、オブジェクト初期化子、匿名型、拡張メソッド、ラムダ式と、Visual BasicとC#の新しい言語機能について説明してきました。これらは単独でも利用できる強力な機能ですが、これらの機能をすべて利用して記述されるのがLINQ(Language Integrated Query:統合言語クエリ)と言われる機能です。
通常、プログラミングをしている際には、オブジェクトや配列、データベース、DataSet、XMLなどさまざまな情報にアクセスする必要があります。従来は、アクセス対象に合わせてプログラミングをしていましたが、LINQを利用することで同じようなプログラミング方法で、異なる情報にアクセスできるようになります。
LINQを利用する場合には大雑把に以下の3つの手順を踏みます。
- アクセス対象のデータソースの用意
- データソースに対する抽出処理
- 抽出データの利用
アクセス対象のデータソースとしては、ArrayListなどのコレクション系オブジェクトや配列、SQL Serverデータベース、Xmlドキュメント、DataSetなどが利用可能です。これらのアクセス対象には、抽出処理をデータソースに対する処理に変換するLINQプロバイダというものが予め用意されているということでもあります。つまり、独自にLINQプロバイダを作成することで、どのようなデータソースに対してもLINQ技術を利用できるということになります。
次に、データソースに対する抽出処理です。抽出処理は一般的にクエリ式というものを使って記述されます。仮にcustomersという名前のデータソースが用意されている場合、抽出処理は次のように記述できます。
Dim query = From cust In customers _ Where cust.City = "London" _ Order By cust.Name Ascending _ Select Name = cust.Name, Phone = cust.Phone
var query = from cust in customers where cust.City == "London" orderby cust.Name ascending select new { Name = cust.Name, Phone = cust.Phone };
SQL文をご存じの場合には、順番こそ異なるものの見慣れた構文ではないかと思います。これがLINQで利用されるクエリ式と言われるものです。しかし、これはクエリ式を利用してこのようにも記述できるというだけで、実態としては次のようなコードを記述しているのと同義です。
Dim query = customers _ .Where(Function(cust) cust.City = "London") _ .OrderBy(Function(cust) cust.Name) _ .Select(Function(cust) New With { _ .Name = cust.Name, Phone = cust.Phone })
var query = customers .Where(cust => cust.City == "London") .OrderBy(cust => cust.Name) .Select(cust => new { Name = cust.Name, Phone = cust.Phone });
ここでの、Where
やOrderBy
などのメソッドはコレクション系クラスなどに対する拡張メソッドです(正確にはIEnumerable(T)インターフェースに対する拡張メソッド)。このように書き直してみると、型推論、オブジェクト初期化子、匿名型、拡張メソッド、ラムダ式のすべてを総動員している集大成の技術であることがご理解いただけるかと思います。ただ、このようなさまざまな機能を利用して書いていたのでは大変なのでこれを簡略化するためにクエリ式という新しい機能を利用して、記述を簡単にしているということになります。
最後に抽出されたデータはFor Each構文などを利用したり、WindowsフォームのDataGridViewやASP.NETのGridViewなどにそのまま利用したりといったことができます。特にASP.NETには新しいDataSourceコントロールとしてLinqDataSourceコントロールというものも用意されているので、データバインド機能の中に簡単に組み込むことができます。
まとめ
今回は.NET Framework 3.5の新機能をいろいろな点から紹介しました。全体像や前バージョンとの互換性に関する注意点を見ることで新しい.NET Frameworkが位置するところをご理解いただけたでしょうか。クラスライブラリとして、言語そのものとして、さまざまな新機能が追加されていることがわかるかと思います。
また、今回は細かい詳細の動作は説明できませんでしたが、LINQという大きな技術についてこれを支えている言語機能という点から紐解いて説明しました。少しとっつきにくいと思われる大型テクノロジーを理解する糸口になれば幸いです。
次回はクライアントサイドを中心とした.NET 3.5世代のASP.NETとWebテクノロジについて解説する予定です。どうぞお楽しみに。