Road of Linqulien


@yone64 で Twitterやってたりします。
 ←こんなアイコン



よく、「めとべや」とかに出没しています。
◦ 1月にWPFで何かやるらしいよ~(宣伝


メトロってなんだったんだろう…


LINQは次の2種類のデータソースを対象としてい
る
◦ IEnumerable<T>
 主にオンメモリのデータソースを表すInterface
 LINQ to Object, LINQ to XML

◦ IQueryable<T>
 主に外部のデータソースを表すInterface
 LINQ to SQL, LINQ to Entity

◦ 番外:IObservable<T>
 Reactive Extentions
 ↑今回は扱いません <(_ _)>


オンメモリのデータに対し、各データを列挙しな
がら、プログラムで評価していく手法。
◦ 通常は、System.Linq.Enumerableクラスに定義されて
いる拡張メソッド群を利用し、IEnumerable<T>を実装
するデータソースに対し評価を行う。
◦ このあたりは、この後の@neueccさんのセッションで詳
しく聞けるに違いない。
 (o゚▽゚)o 期待


外部のデータソースに対して、各データソースの
問い合わせ言語を用いて問い合わせをおこなう
◦ 通常は、System.Linq.Queryableクラスに定義されてい
る拡張メソッド群を利用し、IQueryable<T>を実装す
るデータソースに対し評価を行う。



例えば、LINQ to SQLだと
◦ C#(ラムダ式)で書かれた問合せ条件を、SQLに変換す
る
◦ DB対しSQLを発行し問合せを行う
◦ 問合せの結果をオブジェクトに詰め返却する


IQueryable<T>
◦ データソース自体を表すインターフェース
◦ IQueryProviderとExpressionをメンバとして持つ



IQueryProvider,IQueryProvider<T>
◦ データソースに対し、問合せを行う本体。
◦ 通常、LINQの利用者は意識しない。
◦ CreateQueryとExecuteをメンバをとして持つ


Expression
◦ C#の構文をデータ構造として保持するためのクラス群
◦ ラムダ式からExpressionへの変換はコンパイラが行う



System.Linq.Queryable
◦ IQueryable<T>に対する操作を行う拡張メソッド群を
定義している
◦ 各拡張メソッドでは、IQueryProvider.CreateQueryを
利用し、IQueryable<T>を生成する。



C# の構文をデータ構造として、保持する仕組み
コンパイル時に、ラムダ式から変換される。
Expression<Func<int,Bool>>
┗Parameters
ParameterExpression
┗Name :
a
┗Type :
int


┗Body
BinaryExpression
┗Left
ParameterExpression
┗Name :
a
┗Type :
int
┗Right
ConstantExpression
┗Value :
10
┗Type :
int
┗NodeType : GreaterThan
┗Type : bool
┗ReturnType : bool

ラムダ式から左図のような
構造のExpression Tree が
作成される


LINQを利用してATNDにアクセスしてみる
◦ LINQ to ATND


内部データ・外部データを意識することなく、統
一された記法でコーディングが可能。
◦ とはいえ、アルゴリズム的には意識せずに組むわけには
いかない



外部クエリのコンパイル時検証が可能
◦ とはいえ、全て検証出来るわけではなく、実行時エラー
になることも



カスタムプロバイダの作成も可能
◦ ちゃんとした物を作るのは、ちょーめんどい


チュートリアル : IQueryable LINQ プロバイダの作成
◦ http://msdn.microsoft.com/jajp/library/bb546158(v=vs.90).aspx#fbid=4gWozV-bKl9



LINQ: Building an IQueryable provider series
◦ http://blogs.msdn.com/b/mattwar/archive/2008/11/18
/linq-links.aspx



式ツリー
◦ http://msdn.microsoft.com/jajp/library/bb397951.aspx



C#たんっ!:2種類のLINQ
◦ http://csharptan.wordpress.com/2011/12/09/2%E7%A8
%AE%E9%A1%9E%E3%81%AElinq/

もう一つのLINQ ~ Queryable入門