linq の概要とかもろもろ

21
青青 青@ShinichiAoyagi LINQ 青青青青青青青青青 LINQ 青青青 VS 青青青青青青青青青青青 青青 青 2 青 2013/6/29 土土 ()

Upload: shinichiaoyagi

Post on 10-May-2015

4.302 views

Category:

Technology


6 download

DESCRIPTION

LINQ 勉強会(VSハッカソン倶楽部勉強会 大阪 第2回)のセッション資料です。

TRANSCRIPT

Page 1: LINQ の概要とかもろもろ

青柳 臣一  @ShinichiAoyagi

LINQ の概要とかもろもろ

LINQ 勉強会VS ハッカソン倶楽部勉強会 大阪 第 2 回

2013/6/29(土)

Page 2: LINQ の概要とかもろもろ

• 青柳 臣一(あおやぎ しんいち)@ShinichiAoyagihttp://shinichiaoyagi.blogspot.jp/

• 職業  C# やら VB やら WPF やらでソフトウエア開発   最近はスマホとか   あと PHP + MySQL で SNS 作ったり

自己紹介

Page 3: LINQ の概要とかもろもろ

• Language-Integrated Query

• クエリー機能を言語に統合

• クエリーは SQL とかのクエリー  「問い合わせ」

• Visual Studio 2008 ( .NET Framework 3.0 )で搭載

LINQ

Page 4: LINQ の概要とかもろもろ

• C# や VB で SQL みたいな書き方ができる

• let 、 join 、 group 、 orderby など一通りのことはできる

クエリー式

var array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };var q = from x in array

where x % 2 == 0select x;

Dim array() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}Dim q = From x In array

Where x Mod 2 = 0Select x

Page 5: LINQ の概要とかもろもろ

• すべてクエリー式を使わない形に変換可能

クエリー式はシンタックスシュガー

var q = array.Where(x => x % 2 == 0).Select(x => x);

Dim q = array.Where(Function(x) x Mod 2 = 0).Select(Function(x) x)

Page 6: LINQ の概要とかもろもろ

• VS 2008 のときの追加機能は LINQ のため• 暗黙的な型指定( var 、 Dim )• 拡張メソッド• ラムダ式• 匿名クラス• オブジェクト初期化子、コレクション

初期化子

すべては LINQ のために (1)

Page 7: LINQ の概要とかもろもろ

すべては LINQ のために (2)

var people = new[]{

new Person() { Name = “太郎 ", Age = 14, },

new Person() { Name = “花子 ", Age = 17, },};var q = people

.Where(x => x.Age <= 15)

.Select(x => new { x.Name });

var

コレクション初期化子

オブジェクト初期化子

拡張メソッド

ラムダ式

匿名クラス

Page 8: LINQ の概要とかもろもろ

すべては LINQ のために (3)

Dim people() ={

New Person() With {.Name = “太郎 ", .Age = 15},

New Person() With {.Name = “花子 ", .Age = 14}}Dim q = people.

Where(Function(x) x.Age <= 15).Select(Function(x) New With {x.Name})

var

コレクション初期化子

オブジェクト初期化子

拡張メソッド

ラムダ式

匿名クラス

Page 9: LINQ の概要とかもろもろ

• IEnumerable– 配列やコレクションは IEnumerable を実

装している

• だから– System.Linq.Enumerable

LINQ to Objects (1)

public static IEnumerable<TSource> Where<TSource>(

this IEnumerable<TSource> source,Func<TSource, bool> predicate);

public static IEnumerable<TSource> Where<TSource>(

this IEnumerable<TSource> source,Func<TSource, int, bool> predicate);

Page 10: LINQ の概要とかもろもろ

• System.Linq.Enumerable.Where

LINQ to Objects (2)

public static IEnumerable<TSource> Where<TSource>(

this IEnumerable<TSource> source,Func<TSource, bool> predicate)

{foreach (var item in source){

if (predicate(item)){

yield return item;}

}}

Page 11: LINQ の概要とかもろもろ

• 要するに for や foreach になります

↑ ちょっと乱暴

LINQ to Objects (3)

Page 12: LINQ の概要とかもろもろ

• XElement 族

LINQ to XML (1)

var xml =new XElement("People",

new XElement("Person",new XElement(“Name”, “太

郎 "),new XElement("Age", 15)

),new XElement("Person",

new XElement(“Name”, “花子 "),

new XElement("Age", 14))

);

Page 13: LINQ の概要とかもろもろ

LINQ to XML (2)

var q = xml.Descendants("Person").Where(x => (int)x.Element("Age") <= 15);

var q = xml.Descendants("Person").Where(x => ((int?)x.Element("Age") ?? int.MaxValue) <=

15);

xml.Descendants("Person").Max(x =>(int?)x.Element("Age"))

Page 14: LINQ の概要とかもろもろ

• VB は変態すぎてちょっと、、、

LINQ to XML (3)

Dim xml = _<People>

<Person><Name>太郎 </Name><Age>15</Age>

</Person><Person>

<Name>花子 </Name><Age>14</Age>

</Person></People>

Page 15: LINQ の概要とかもろもろ

• VB は変態すぎてちょっと、、、

LINQ to XML (4)

Dim q = From x In xml...<Person>Where x.<Age>.Value <= 15Order By x.<Age>.ValueSelect x.<Name>

Page 16: LINQ の概要とかもろもろ

• 見た目は LINQ to Objects とほぼ同じ

LINQ to SQL (1)

var db = new DataClasses1DataContext();var q = from x in db.People

where x.Age <= 15select x.Name;

var db = new DataClasses1DataContext();var q = db.People

.Where(x => x.Age <= 15)

.Select(x => x.Name);

Page 17: LINQ の概要とかもろもろ

• テーブルとかは IQueryable

• だから– System.Linq.Queryable

LINQ to SQL (2)

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source,Expression<Func<TSource, bool>> predicate);

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source,Expression<Func<TSource, int, bool>>

predicate);

Page 18: LINQ の概要とかもろもろ

• Expression って?– 型( int や string と同じく一級市民の型)– System.Linq.Expressions.Expression<TDeledate> クラス

のこと

• 実行コードをデータとして表現したもの

• 暗黙の型変換– ラムダ式は暗黙に Expression 型に変換できる– 1 を 1.0 に暗黙に変換できるように

“ x => x % 2 == 0” をこのラムダ式の内容を表す Expression 型に変換できる

LINQ to SQL (3)

Page 19: LINQ の概要とかもろもろ

• コンパイル時にすること– ラムダ式を Expression 型に変換するコー

ドを作り出す

• 実行時(列挙したとき)にすること– Expression 型を元に SQL 文を作ったりし

て実行

LINQ to SQL (4)

Page 20: LINQ の概要とかもろもろ

ぐるぐる回すもの

LINQ とは

Page 21: LINQ の概要とかもろもろ

• ぐるぐる回らない LINQ (笑)

• 非同期やイベントドリブンなものを LINQ っぽく扱えるようにするもの

Reactive Extensions (Rx)