もう一つのlinq ~ queryable入門

12
もも もも LINQ ~ Queryable もも Road of Linqulien

Upload: yone64

Post on 28-May-2015

2.151 views

Category:

Technology


3 download

DESCRIPTION

もう一つのLINQ ~ Queryable入門

TRANSCRIPT

Page 1: もう一つのLINQ ~ Queryable入門

もう一つの LINQ ~Queryable 入門

Road of Linqulien

Page 2: もう一つのLINQ ~ Queryable入門

@yone64 で Twitter やってたりします。

← こんなアイコン

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

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

自己紹介

Page 3: もう一つのLINQ ~ Queryable入門

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

Page 4: もう一つのLINQ ~ Queryable入門

オンメモリのデータに対し、各データを列挙しながら、プログラムで評価していく手法。◦ 通常は、 System.Linq.Enumerable クラスに定義され

ている拡張メソッド群を利用し、 IEnumerable<T> を実装するデータソースに対し評価を行う。

◦ このあたりは、この後の @neuecc さんのセッションで詳しく聞けるに違いない。 (o ゚▽゚ )o 期待

Enumerable

Page 5: もう一つのLINQ ~ Queryable入門

外部のデータソースに対して、各データソースの問い合わせ言語を用いて問い合わせをおこなう◦ 通常は、 System.Linq.Queryable クラスに定義されて

いる拡張メソッド群を利用し、 IQueryable<T> を実装するデータソースに対し評価を行う。

例えば、 LINQ to SQL だと◦ C# (ラムダ式)で書かれた問合せ条件を、 SQL に変換

する◦ DB 対し SQL を発行し問合せを行う◦ 問合せの結果をオブジェクトに詰め返却する

Queryable

Page 6: もう一つのLINQ ~ Queryable入門

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

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

Queryable 関係者 – その1

Page 7: もう一つのLINQ ~ Queryable入門

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

System.Linq.Queryable◦ IQueryable<T> に対する操作を行う拡張メソッド群を

定義している◦ 各拡張メソッドでは、 IQueryProvider.CreateQuery

を利用し、 IQueryable<T> を生成する。

Queryable 関係者 – その2

Page 8: もう一つのLINQ ~ Queryable入門

C# の構文をデータ構造として、保持する仕組み コンパイル時に、ラムダ式から変換される。

式木 ~ Expression Tree

Page 9: もう一つのLINQ ~ Queryable入門

実行時の構造 ラムダ式から左図のような

構造の 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

Page 10: もう一つのLINQ ~ Queryable入門

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

◦ LINQ to ATND

Demo

Page 11: もう一つのLINQ ~ Queryable入門

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

いかない 外部クエリのコンパイル時検証が可能

◦ とはいえ、全て検証出来るわけではなく、実行時エラーになることも

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

メリット・デメリット