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テクノロジについて解説する予定です。どうぞお楽しみに。
参考資料
- 修正履歴
-
- 2008/04/09 16:23 P3.ラムダ式 戻り値の型指定ができない点について訂正して追記
- 2008/03/17 17:13 ソース「拡張メソッドの定義(C#)」のtypo修正:target => source
この記事は参考になりましたか?
既に会員の方はを行ってください。
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト りばてぃ/FUJIKO/ナオキ(リバティ, フジコ, ナオキ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社
この記事は参考になりましたか?
この記事をシェア

