linq の概要とかもろもろ
DESCRIPTION
LINQ 勉強会(VSハッカソン倶楽部勉強会 大阪 第2回)のセッション資料です。TRANSCRIPT
青柳 臣一 @ShinichiAoyagi
LINQ の概要とかもろもろ
LINQ 勉強会VS ハッカソン倶楽部勉強会 大阪 第 2 回
2013/6/29(土)
• 青柳 臣一(あおやぎ しんいち)@ShinichiAoyagihttp://shinichiaoyagi.blogspot.jp/
• 職業 C# やら VB やら WPF やらでソフトウエア開発 最近はスマホとか あと PHP + MySQL で SNS 作ったり
自己紹介
• Language-Integrated Query
• クエリー機能を言語に統合
• クエリーは SQL とかのクエリー 「問い合わせ」
• Visual Studio 2008 ( .NET Framework 3.0 )で搭載
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
• すべてクエリー式を使わない形に変換可能
クエリー式はシンタックスシュガー
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)
• VS 2008 のときの追加機能は LINQ のため• 暗黙的な型指定( var 、 Dim )• 拡張メソッド• ラムダ式• 匿名クラス• オブジェクト初期化子、コレクション
初期化子
すべては LINQ のために (1)
すべては 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
コレクション初期化子
オブジェクト初期化子
拡張メソッド
ラムダ式
匿名クラス
すべては 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
コレクション初期化子
オブジェクト初期化子
拡張メソッド
ラムダ式
匿名クラス
• 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);
• 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;}
}}
• 要するに for や foreach になります
↑ ちょっと乱暴
LINQ to Objects (3)
• 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))
);
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"))
• VB は変態すぎてちょっと、、、
LINQ to XML (3)
Dim xml = _<People>
<Person><Name>太郎 </Name><Age>15</Age>
</Person><Person>
<Name>花子 </Name><Age>14</Age>
</Person></People>
• VB は変態すぎてちょっと、、、
LINQ to XML (4)
Dim q = From x In xml...<Person>Where x.<Age>.Value <= 15Order By x.<Age>.ValueSelect x.<Name>
• 見た目は 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);
• テーブルとかは 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);
• Expression って?– 型( int や string と同じく一級市民の型)– System.Linq.Expressions.Expression<TDeledate> クラス
のこと
• 実行コードをデータとして表現したもの
• 暗黙の型変換– ラムダ式は暗黙に Expression 型に変換できる– 1 を 1.0 に暗黙に変換できるように
“ x => x % 2 == 0” をこのラムダ式の内容を表す Expression 型に変換できる
LINQ to SQL (3)
• コンパイル時にすること– ラムダ式を Expression 型に変換するコー
ドを作り出す
• 実行時(列挙したとき)にすること– Expression 型を元に SQL 文を作ったりし
て実行
LINQ to SQL (4)
ぐるぐる回すもの
LINQ とは
• ぐるぐる回らない LINQ (笑)
• 非同期やイベントドリブンなものを LINQ っぽく扱えるようにするもの
Reactive Extensions (Rx)