連載:[完全版]究極のC#プログラミングChapter15 LINQとクエリ式川俣 晶2010/03/17 |
|
|
15.3 「値の集まり」に対する演算
第4章にも書いたが、プログラミング言語は「値」に対する演算のほかに、「値の集まり」に対する演算機能を提供することがある。たとえば、パソコンブーム初期のBASIC言語インタープリタには、行列演算機能を持つものやそれをオプションとして提供するものがあった。ほかにも、1957年に生まれたプログラミング言語であるAPLは、配列を直接演算する機能などを備えていた。
このような「値の集まり」に対する演算機能は、パソコン用の主要なプログラミング言語の世界ではあまりサポートされたことがない。たとえば、C言語にはそのような機能はないし、その後のC++やJavaのようなオブジェクト指向言語では、言語に組み込まれた機能ではなく、クラスライブラリとして整備される方向に進んだ。しかし、最終的にきめ細かい作業を行おうと思うと、個別の値に対する処理を繰り返すコーディングが必要とされた。
C# 3.0のLINQとは、そのような流れに逆らうものだろうか? その答えの半分はイエスであり、半分はノーである。
まず、LINQの本当の姿とは何かを確認しよう(次ページ図15.1参照)。
LINQとは、.NET Framework 3.5のクラスライブラリでサポートされた、純然たるクラスライブラリである。そして、ライブラリというレイヤで物事が進行する。それゆえに、LINQを使うために「言語に統合されたクエリ機能」は必須ではないし、専用の仮想マシンも必要ない。そのような意味で、まさにライブラリである。C#の言語に統合されたクエリ構文は、実際にはライブラリ呼び出しの糖衣構文(シンタックスシュガー)の一種でしかない。
しかし、“個別の値に対する処理を繰り返す”ことはあまり要求されない形で設計されている。基本的に、繰り返しの処理はクエリ結果を列挙する場合にのみ発生し、クエリ本体は繰り返し処理を記述することなく進行する。そのため、LINQは「値の集まりに対する(繰り返し処理を使わない)演算」という要素が強い。
さらにいえば、LINQは拡張可能である。データベースも何もないプレーンな状態で、LINQは.NET Frameworkのオブジェクトに対して問い合わせを行うことができる。これは「LINQ To Objects」と呼ばれる。
これに対して、「LINQプロバイダー」と呼ばれるオブジェクトを用意することで、特定のデータに対して、効率的にクエリを行う手段が提供されている。標準で提供されるLINQプロバイダーには次のようなものがある。
- LINQ To SQL
- LINQ To XML
- LINQ To ADO.NET
- LINQ To DataSet
図15.1 LINQアーキテクチャ |
このほか、LINQプロバイダーを自作することもできる。本章では基本であるLINQ To Objectsを集中的に扱っていく。LINQ To SQLやLINQ To XMLについては、それぞれ第17章と第18章で扱う。
「[完全版]究極のC#プログラミング」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|