月別アーカイブ: 2009年06月

8 posts

LINQ in Action 5

第三部Querying relational data(6、7、8章)を予定通り読了しました。ただし、最後の方はやっとゴールにたどり着いたという感じです。

6章は[LINQ to SQL]の基本機能の説明。
7章はマッピングの詳細とそのツールの説明(手動のインライン記述、XMLファイル、SqlMetal、VS2008のデザイナツール)。[LINQ to SQL]のDataContextはADO.NETのデータセットに近い機能を持っていると思いますが、データベースから読み込まれたデータのライフサイクルについてDataContextの動作説明をします。またQuery ExpressionをSQLに変換する話で、expression treeの話がでてきますが、何のためにどのように使うのかよく理解できませんでした。
8章では、data conflictsおよびTransactionScope、つづいてstored procedures、user-defined functions、partial class(partial mechod)、objects inheritance等について、パフォーマンスやセキュリティに関連付けながら解説します。
特に8章には示唆に富んだ話題が沢山ありますが、充分理解できたとは言いがたいのが実際のところです。
必要に応じてぜひ読み返したいと思います。

ところで、「我々は、今後LINQを開発の中でどのように使っていくのか」という問題です。過去のADO.NETの資産のことを考えあわせると、いまのところ、簡単なデータベースの問い合わせは[LINQ to SQL]で、本格的な処理は[ADO.NET Entity Framework]になるのかなと思っています。[LINQ in Action]は[ADO.NET Entity Framework]については余り触れていませんが、訳が悪いと散々けなした「プログラミング LINQ」には丁寧な解説がありますので、[ADO.NET Entity Framework]についてはこの本で勉強したいと思います(この本は、expression treeにもかなりのページを割いて解説しています。必要なときこれもこの本を使いたいと思います)。

お勉強が終わったので、実務でプログラミングしながら必要な部分を習得していきたいと思います。

追。(2009/7/1)
Zeeshan Hiraniの[Entity Framework learning guide]がEntity Frameworkのベストの解説のようですね。
PDFで500ページ以上もあります。これも英文ですが…。
<a href=”http://weblogs.asp.net/zeeshanhirani/” target=”_blank”>http://weblogs.asp.net/zeeshanhirani/</a>

LINQ in Action 4

第二部(Querying objects in memory)を読了しました。二部は約100ページで二つの章(4章、5章)があります。

ここではデータベースではなく、メモリー上でのLINQ動作の説明です。即ち、いくつかのクラスを定義、オブジェクト配列を作成し、操作します。
4章では、WebおよびWindowプロジェクトを作成し、コントロールを使って条件を変えて、GridViewにデータを表示します。
5章では、すこし突っ込んだ議論があります。5章の最後にLINQのパフォーマンスについて検討します。ここはあくまでもメモリー上での話ですが、配列をforでループし、内容を別の配列にコピーする場合、同じくforeachを使う場合、LINQを使う場合等について、ベンチマークテストを行います。
結果からいうと、簡単な条件の場合は、for文が良くてLINQはその1.5倍の時間がかかります。しかし、ループの中で複雑な作業を要する場合は、その差は僅かになり、更に場合によってはLINQの方がいい成績を出します。
「パフォーマンスだけでなく、プログラムの読みやすさからいえば、LINQの方が総じて勝っている。しかしどちらにしても、何を使うかはユーザが場合に応じてよく検討してください」というのが著者のコメントです。

第三部はデータベースとLINQとの関係(LINQ to SQL)の説明です。入り口まで読みましたが、LINQ to SQLではデータベースとクラスとのマッピングを作り、それを基にLINQ Queryを作成します。
ADO.NETのように明示的にConnectionを作り、必ずcloseするような作業はなく、驚くほどシンプルにQueryを書くことができます。
様々な技法を使ったサンプルプログラムをVS2008 + SQL Serverの環境で動かして、理解を深めることが出来ます。

感想:
1. 余談ですが、第二章ではGridViewおよびDataBindを使っています。わたしもVS2002で早速使ったのですが、わけの分からない動作をし、それに懲りてそれ以降DabaBindを一切使いません。皆さんはどうでしょうか。
2. 通常の手続き型言語では、プログラムは上から下へ実行します(勿論、分岐があれば分岐しますが)。
LINQは遅延実行(deferred execution)をしていて、query文では実際のデータ読み込みはしていなく、実際にデータが必要になったとき初めてqueryを実行します。
例えば、「query文でデータファイルを一行読み、続く文がその一行のデータの処理をする」とすると、後の文の処理が終わると、自動的に(分岐文なしで)最初のデータ読み込み文に返ります(データ読み込み文が一度に全部読み込むのであれば、読み込みは一度だけ)。
LINQはいわば昔の言葉でいえばマクロのような感じですね。
3. 私は、ADO.NETではDataViewをふんだんに使っているのですが、LINQではどうするのか気になっています。

ジェネリック デリゲート

下のコードは、最も初歩的なLINQのC#コードで、words Arrayの中で文字長5以下のものを表示するものです(各行の最初の数字は説明のために付加しました)。

1    string[] words = { “hello”, “wonderful”, “linq”, “beautiful”, “world” };

2    var shortWords =
3      from word in words
4      where word.Length <= 5
5      select word;

6    foreach (var word in shortWords)
7      Console.WriteLine(word);

ここで行番号3-5の部分がC#とは異なるLINQのquery expressionといわれるコードです。

コンパイラはこの部分を、一度次のようにC#のコードに変換します(勉強途中なので少し自信がないのですが)。
var shortWords =
      words
         .Where(word => word.Length <= 5)
         .Select word;

ここに拡張C#の「暗黙に型付けされるローカル変数」、「拡張メソッド」、「ラムダ式」等の新機能が使われています。
さらにこのWhereやSelectが何者かというと、VS2008のオンラインヘルプではジェネリックとデリゲートを使って、次のように定義されています。

public static EnumerableRowCollection&ltTRow&gt Where&ltTRow&gt
   this EnumerableRowCollection&ltTRow&gt  source,
   Func&ltTRow, bool&gt predicate
)

LINQの中でこの「ジェネリック デリゲート」が一番ややこしいと思います。その他の部分はそれなりの難しさがあるにしても、やることといえばSQL文とあまり変わりないのではないか。と考えています。

そして私が「ジェネリック デリゲート」についてとっつき難いと思ったのは、私がこれまでジェネリックやデリゲートを真剣に勉強しなかったからではなく、Net Framework 3.5(C#3.0、VB9.0)で初めて導入されたもので、分からなくて当然なのです。

「ジェネリック デリゲート」の説明はVS2008のオンラインヘルプの「Func(TResult)」にあります。これが一番いい資料だと思います。この部分を充分理解すれば、「ジェネリック デリゲート」はOKでしょう。そして「ジェネリック デリゲート」を理解すれば、LINQの根底の技術は理解できる。そしてC#の拡張機能だけで、LINQ機能を書く必要があっても問題なし。

そう考えています(今のところ)。

LINQ in Action 3

一部(3章まで)を読み終えました。
一部はLINQを支える技術(言語の拡張、ラムダ式等)の説明です。二部以降ではAmazonの本の管理を想定して、データベースといくつかのクラスを定義し、具体的にLINQの実装についての説明に入ると思います。

LINQのベースになる技術は、ジェネリックとデリゲートです。この本はC#とVBと両方のコードが載せてありますが、メインの説明はC#です。話題は結構ややこしくなってきました。私がジェネリックもデリゲートも必要な部分しか理解していないこと、C#に不慣れなことも理解の妨げになっていると思います。

また著者の考えで一部はあくまで技術の説明に終始し、具体例での説明を二部以降にしていますので、その意味でも理解が難しかったと思います。但し、私はこの書き方はとても好きです。二部以降でわからなくなったら、一部を見直せば明確に説明があるからです。前にも書いたとおり説明は懇切丁寧で、多分このまま読み進めてもつっかえることは無いだろうと考えています。

どちらにしても、現在までのところ私はこの本に満足していますし、二部は楽しみにしています。

感想:
1. LINQの説明はどれもSelectについてばかりですが、InsertやDeleteやUpdateはどうなっているのか不安を覚えます。
2. 私はCが好きです。関数へのポインターは強力で好きな機能の一つでした。デリゲートは関数へのポインターの欠点を補うために発明されたのだろうと思いますが、ジェネリックと組み合わされると、とても分かりにくくなります。このあたりで直感的に分かりやすい仕組みを誰か発明してほしいものと思います。
3. 特にコンピュータ関連の日本語のいい本がほとんどありません。著者はコチョコチョと勉強して、雑駁な「入門」書を手っ取り早く出版するので、書店に本が沢山あるのにどれもこれも結局役に立ちません。翻訳本も訳の悪いものがあって、何を言っているのかわけの分からない「立派な」本があります。落胆します。マイクロソフト公式解説書と銘打つからには「まさか」と思って買いましたが、「プログラミング LINQ」はいけません。結局多少不自由しても原書を読むことになります。
[LINQ in Action]の著者はフランス人だと思います。この一冊を書くために相当の勉強をしたようです。日本人が世界を対象に本を書くようになれば、日本人のいい本も出てくるのでしょうね。

LINQ in Action 2

ここ数年はパッケージソフトの開発を中心に仕事をしてきて、直接関係ないことはあまり勉強していませんでした。
今回LINQを勉強し、実はOOPとデータとの関係は、ORMとしていくつかの提案があることを始めて知りました(Javaの世界が先行しているようですね)。LINQも確か2005年にマイクロソフトから開発仕様のアナウンスがあったようですね。

それはともかく、[LINQ in Action]は入門書としては大変よくできていると思います。まだ読み進めて100ページにも満たないのですが、読者がLINQをはじめて勉強していることを意識して、順を追って、「後でもっと詳しく説明するからね」という調子で、説明します。コードも必要なものを丁寧に載せています。

初めて知りましたが、VS2008(C#3.0およびVB.NET9.0)のメインの強化点はLINQだったようですね。
LINQのためのC#およびVBの主な強化点は、
 暗黙に型づけされたローカル変数
 オブジェクトの初期化
 ラムダ式
 拡張メソッド
 アノニマス型
です。これを武器にOOPとSQL、OOPとXMLの融合を試みます。

私は現在2章のC#とVBの言語拡張の部分を読んでいますが、だんだん難しくなってきました。一読では全部を理解することはできないのでしょう。

この本は約500ページですが、私は今はXMLには関心がないので、300ページ辺りのSQLの部分まで読もうと思っています。今月中にここまで読んで、開発に応用したいと思います。
予定では。