連載:[完全版]究極のC#プログラミング

Chapter15 LINQとクエリ式

川俣 晶
2010/03/17
Page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

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章で扱う。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter15 LINQとクエリ式
    1.15.1 LINQの面白さ
    2.15.2 LINQとは何か?
  3.15.3 「値の集まり」に対する演算
    4.15.4 なぜLINQなのか?
    5.15.5 最も基本的なLINQ
    6.15.6 LINQの本質は列挙
    7.15.7 LINQを使ううえでの注意点
    8.15.8 クエリ結果を加工する
    9.15.9 複数のソースからクエリする
    10.15.10 条件で絞り込む
    11.15.11 一部項目のみselectする
    12.15.12 シンプルなソート
    13.15.13 クエリの接続
    14.15.14 クエリ結果のグループ化
    15.15.15 複数ソースを関連付けるjoin句
    16.15.16 from句とjoin句のパフォーマンス
    17.15.17 join句のグループ化結合
    18.15.18 join句の左外部結合
    19.15.19 単独で使うDefaultIfEmptyメソッド
    20.15.20 内部列挙を伴うfrom句の二重使用
    21.15.21 let句
    22.15.22 クエリのインスタンス化
    23.15.23 クエリ結果の個数を得る
    24.15.24 Anyメソッドと存在チェック/【C#olumn】クエリ式のデバッグテクニック
    25.15.25 まとめ/【C#olumn】LINQの難しさ/【Exercise】練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間