サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

LINQ テクノロジ入門

はじめに

前回の記事を書いた後で LINQ についてちゃんと身につけたかったため、この本を読んでみました。

LINQ は様々なネット情報だけを見てなんとなく使っていて、モヤモヤ部分があったのでスッキリしました。

LINQ とは

漠然と「集合1を加工する機能」だと思っていましたが、ネット情報にはいずれもそのようなことは書いておらず、探せば探すほどモヤモヤが募っていました。

この本にはそれがズバリと書かれていて、ああやっぱりその理解で良いのかと、やっと腑に落ちた次第です。

本の紹介

全部で 250 ページほどと短めです。手を動かしながら進める部分があるため、そこは少し時間がかかりますが、3日もあれば終えることはできるでしょう。後述の読む部分だけなら1日で済みます。それだけでももちろん強力です。

全体的に LINQ to SQL の情報が多く、手を動かしながら進める部分は LINQ to SQL の操作が大半です。LINQ to SQLSQL とは、ここでは Microsoft SQL Server のことを指していて、残念ながら一般的な意味での RDBMS ではありません。LINQ to SQLSQL Server に格納されているデータに LINQ でアクセスするためのプロバイダ(ドライバ)です。私は現在、業務に SQL Server をつかっていないため、この部分については参考にならず興味も持てなかったので読み飛ばしました。反対に、SQL Server を業務で使用しているかたには実りがあるでしょう。

LINQ はもちろん SQL Server の世界に留まらない技術なので、読んだ価値は十分にありました。

この本の読みかた

一章から三章までと「8.3 ラムダ式の展開」を熟読し、五章から七章は手を動かしながら進め__そして実開発ではリファレンスのように使い__残りの部分に目を通す。そのような読み方になるかと思います。

私は前述の通り、五章から七章は業務に関係ないので読み飛ばしさせていただきました。

この本での呼称

前回の記事で書いた LINQ の二つの構文「クエリ構文」と「メソッド構文」は、この本ではそれぞれ「埋め込みクエリ方式」「拡張メソッド方式」と呼称されていました。まあ当たらずしも遠からずだし、なんだか長いので特に訂正しないでおきます。

LINQ の導入に当たって追加された機能

一章から三章までは概念的な読み物になっていますが、サンプルコードが多用されていてとてもスムーズに頭に入ってきます。

LINQ の導入にあたって C#VB それぞれに導入された新しい概念について LINQ と関連しながら説明がありました。いずれも柔軟で強力な機能ですが、落とし穴を作りそうな機能でもあるので LINQ の文脈以外で濫用しないようにとの戒められています。この一文はぜひこの本を実際に手に取って読んでほしいです。

匿名データ型

Dim a = New With {.Name = "Nobu", .Age = 33}

VB.NET で上記のようにとすると変数 aコンパイラが自動的に匿名クラスのオブジェクト型として扱ってくれます。なんとエディタのコード補完も効きます。C# では var キーワードで作成する変数です。

LINQ とともに導入されたもので、かつての Variant 型のようなものではありません。

自動プロパティ

public class Employee
{
    public string Name {get; set;}
    public int    Age {get; set;}
}

知ってると思いますが C# で上記のように記述するとコンパイラが自動的に private なフィールドを作成してくれます。

この機能は VB.NET にはありません。

オブジェクト初期化子

オブジェクト初期化子は、コンストラクタを持っていないクラスでも同時に初期化ができる記述法で、VB.NET では以下のように記述します。

Dim a As New Employee With {.Name = "Nobu", .Age = 33}

拡張メソッド

Dim a As Integer() = {1, 2, 3}
Dim b As Integer = a.Sum()          ' 結果、変数 b は 6 になる。

上のコードの二行目にある Sum() は、これまでの感覚だと Integer() のメソッドのように思えますが、LINQ ライブラリによって提供されている「拡張メソッド」だとのことです。

外部からメソッドを追加するという、オブジェクト指向の理念に反したものなので LINQ 以外で濫用しない旨、この本では戒めています。

パイプライン処理(RDBMS との違い)

RDBMS の SELECT は、データの集合から別のデータの集合へと加工します。それに対して LINQ は、データの集合をパイプライン処理で加工するものです。そうして LINQ で加工した結果は、やっぱりデータの集合である場合もありますが、オブジェクトだったりすることもあります。

上記の Sum() のコード例では整数の集合(配列)から整数へと加工しています。

パイプライン処理というよりメソッドチェーンと言った方が理解しやすいかたもいるかもしれません。

RDBMS では最初に抽出後の列を SELECT 句の下に書きますが、LINQ はパイプライン処理なので、最初に「どのデータ集合を加工するのか」を指定しなければなりません。これは RDBMS では FROM 句で指定するものです。そこから「データ集合から抽出する内容は何か」を指定する WHERE が続きます。LINQ クエリで SQL の SELECT 文とは Select, From Where の登場する順序が異なるのは、このパイプライン処理に由来するものであるためということがよくわかります。

LINQ の二つの記述法のうち、パイプライン処理(メソッドチェーン)であることが明確にわかる「拡張メソッド方式」の採用を、この本でも勧めていました。なじみのある SQL からへだたりがある理解し難い LINQ の記法も、こうした説明があればとても理解しやすいものだと感じました。

ソートの方法・JOIN の方法

ソートや結合など、気がかりだった機能とその記法についても知ることができました。ハンズオンはしていませんが五章から七章にかけて、LINQ のさまざまな機能についての詳説があり、とても役に立ちました。

説明は割愛します。役に立つ本なので手元に置いても良いでしょう。

おわりに

「入門」とありますが LINQ 以外については「.NET Framework の他の機能についてはもう知っているよね」というスタンスで書かれた本です。Amazon にもそのような旨のレビューがありました。全くの初学者が手に取っても、確かにつらいでしょう。しかし業務である程度(数年?) .NETRDBMS に触れたことがあれば読み進めることができると思います。

本記事も含まれると思いますが、ネット情報では、やはり圧倒的に情報が不足しています。ぜひ実際にこの本を手に取って読んでみてください。


  1. .NET の世界では「コレクション」と言った方が解りやすいかもしれません。