ページ

2010年6月4日金曜日

C#勉強中 C# 3.0 入門 6

おもいっきり間が空いてしまいましたが、C# 3.0 入門の続きを
  • 第6回 LINQ基礎編
    まずは、LINQの概要説明。確かにDBアクセスに絡んで解説されることが多いLINQですが、ここに記述されているように、言語仕様に組み込まれた集合演算と捉えるべきでしょう。DBのカラム名を間違えていて何度も実行時にエラーを出した身としては、IDEレベルでチェックが入るようになっている点だけでも有難いことです。しかし本質的には、DBとは独立してIEnumerableオブジェクトを対象とした集合演算です。DB、特にRDBの場合そのままではプログラム側のオブジェクト表現と親和性が良くないので、内部的にオブジェクト表現に変換するようなコードを愛用していた身としては、オブジェクトに対する集合演算が可能になったというのは何よりです。
    注意すべき点はLINQ式はコレクションを生成するのではなく、列挙オブジェクト(インターフェース)を生成している点で、これにより、データソースへのアクセスはLINQ式を受けた変数にアクセスした時点まで遅延されます。アクセス以前にデータソースを変更した場合には、その変更を含めたコレクションが列挙されます。またコレクションの複製を作らないのでメモリも無駄に使わずにすみます。このあたり、foreachでの列挙と異なる点で注意が必要になります。
    LINQの基本形は「from A in B where 条件 select 操作」となります。「from A in B」がfrom句で、(列挙可能な)データソースBのデータを名前Aで参照することを指示します。from句は複数指定可能で、それらの直積が列挙されます。列挙の条件はwhere句で限定することができます。列挙されたデータ(名前はfrom句で指定)はselect句で加工します。select句で単純にfrom句で指示した名前だけを指定した場合には、列挙されたデータそのものに対する列挙オブジェクトが得られますし、A.ToString()とすれば文字列の列挙オブジェクトが得られます。
    select句による加工で一番興味深いものは、「new { x.属性1, x.属性2 };」という形式での匿名型オブジェクトの生成でしょう。多数の属性を持つオブジェクトから一部の属性値だけを抽出し、それらの一部属性だけを持った(匿名の)オブジェクトを列挙することが可能になっています。この場合、型が匿名ですので、LINQ式の値はvar型の変数で受け取ることになります。
    「order by によるソート」はSQLでおなじみのものですね。「into句によるqueryの接続」はSQLでは見ないパターンですね。SQLではintoで一時テーブルに格納するようなイメージですがLINQでは受け皿の変数への格納イメージになるようです。「group 要素 by キー」はグループ化でこれもSQLでおなじみのものですが、LINQでは結果が「IGrouping」型で返されるようです。まあこれは決まりということで。
    join句による内部結合「join 名前 in データソース on 式1 equals 式2」もSQLでおなじみですが、まあ表現が少々異なっていますね。二つのfrom句で二つのデータソースから列挙するとそれぞれのでーたの直積になるので、データ数が多い場合には負荷が増大していきますが、joinでは参照が最小に抑えられます。join句には他の使い方もあるそうですが、そこらあたりは以降の章で、だそうです。

0 件のコメント:

コメントを投稿