LINQが気になる

WEB+DB PRESS Vol.43に載ってたC#LINQって機能が気になる。隣のクラスの一番可愛い子ぐらい気になる。自分の求めていた物に方向性がかなり近いっぽい。


メモリ内のコレクションとDB内のレコードが同じ書式で問い合わせ出来る。グループ化や集約演算も使える。しかも遅延評価でパフォーマンスを上げているらしい。


ということは、グループ化や集約関数も含めて代数的に取り扱う仕組みがあって、最後に実際に取得結果を評価する時に最適な形でSQLに変換してDBに投げてるということか。今はそうでなくとも、少なくともそういった形をゴールに想定しているんではないかと思う。


例えば、HTMLテンプレート上で部署一覧を表示する場合について考える。繰り返しタグを使って各部署ごとに繰り返し、部署名等の他にその部署に属する社員の人数を文字列表示タグを使って表示するとしよう。遅延処理が可能なら、繰り返しタグや文字列表示タグの段階ではDBアクセスをおこなわず、繰り返しタグの終了タグを処理する段階(あるいはページ全体を処理した後)で最低限の表示項目について一回のSQLでデータの取得&レンダリングをおこなうというようなことが可能になるだろう。もしそんなことが出来ればn+1 selects problemもおこらない。


メモリ内のコレクションとDBのテーブルを統一的に扱えるなら、問い合わせ条件をコレクションとテーブル間のリレーションとして記述し、場合によってinで取って来たり、一部SQLで絞り込んで取得した上でメモリ上で再度絞り込んだり、絞り込みはSQLでやって並べ替えはメモリ上のコレクションを参照しながらやったりとかも自動で出来るようになるかもしれない。


とりあえずグループ化や集約関数を内部でどうやって扱ってるのかが気になる。ぐぐると関係代数と集約関数についてもかなり研究されたりしてるみたいなので、なんらかの理論的な裏付けが可能なんだろうとは思う。自分の頭で理解出来るレベルならば是非パクりたい。