もう一つのlinq ~ queryable入門
DESCRIPTION
もう一つのLINQ ~ Queryable入門TRANSCRIPT
もう一つの LINQ ~Queryable 入門
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
↑ 今回は扱いません <(_ _)>
2種類の Datasource
オンメモリのデータに対し、各データを列挙しながら、プログラムで評価していく手法。◦ 通常は、 System.Linq.Enumerable クラスに定義され
ている拡張メソッド群を利用し、 IEnumerable<T> を実装するデータソースに対し評価を行う。
◦ このあたりは、この後の @neuecc さんのセッションで詳しく聞けるに違いない。 (o ゚▽゚ )o 期待
Enumerable
外部のデータソースに対して、各データソースの問い合わせ言語を用いて問い合わせをおこなう◦ 通常は、 System.Linq.Queryable クラスに定義されて
いる拡張メソッド群を利用し、 IQueryable<T> を実装するデータソースに対し評価を行う。
例えば、 LINQ to SQL だと◦ C# (ラムダ式)で書かれた問合せ条件を、 SQL に変換
する◦ DB 対し SQL を発行し問合せを行う◦ 問合せの結果をオブジェクトに詰め返却する
Queryable
IQueryable<T>◦ データソース自体を表すインターフェース◦ IQueryProvider と Expression をメンバとして持つ
IQueryProvider,IQueryProvider<T>◦ データソースに対し、問合せを行う本体。◦ 通常、 LINQ の利用者は意識しない。◦ CreateQuery と Execute をメンバをとして持つ
Queryable 関係者 – その1
Expression◦ C# の構文をデータ構造として保持するためのクラス群◦ ラムダ式から Expression への変換はコンパイラが行う
System.Linq.Queryable◦ IQueryable<T> に対する操作を行う拡張メソッド群を
定義している◦ 各拡張メソッドでは、 IQueryProvider.CreateQuery
を利用し、 IQueryable<T> を生成する。
Queryable 関係者 – その2
C# の構文をデータ構造として、保持する仕組み コンパイル時に、ラムダ式から変換される。
式木 ~ Expression Tree
実行時の構造 ラムダ式から左図のような
構造の Expression Tree が作成される
Expression<Func<int,Bool>>┗ Parameters
┗ Body
┗ ReturnType : bool
ParameterExpression┗ Name :a┗ Type :int
BinaryExpression┗ Left
┗ Right
┗ NodeType : GreaterThan┗ Type : bool
ParameterExpression┗ Name :a┗ Type :int
ConstantExpression┗ Value :10┗ Type :int
LINQ を利用して ATND にアクセスしてみる
◦ LINQ to ATND
Demo
内部データ・外部データを意識することなく、統一された記法でコーディングが可能。◦ とはいえ、アルゴリズム的には意識せずに組むわけには
いかない 外部クエリのコンパイル時検証が可能
◦ とはいえ、全て検証出来るわけではなく、実行時エラーになることも
カスタムプロバイダの作成も可能◦ ちゃんとした物を作るのは、ちょーめんどい
メリット・デメリット
チュートリアル : IQueryable LINQ プロバイダの作成◦ http
://msdn.microsoft.com/ja-jp/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/ja-jp/library/bb397951.aspx
C# たんっ!: 2 種類の LINQ◦ http://csharptan.wordpress.com/2011/12/09/2%E7%A8%
AE%E9%A1%9E%E3%81%AElinq/
参考