c# linq入門

69
Hokuriku.NET C# LINQ 入入 2011/06/11 小小 小小小 入入入入入入入入入入入入

Upload: fujio-kojima

Post on 12-Nov-2014

4.235 views

Category:

Technology


7 download

DESCRIPTION

2011/06/11 Hokuriku.NET C# LINQ入門http://atnd.org/events/15800

TRANSCRIPT

Page 1: C# LINQ入門

Hokuriku.NET

C# LINQ 入門

2011/06/11小島 富治雄

福井コンピュータ株式会社

Page 2: C# LINQ入門

Agenda

1. はじめに2. C# のこれから3. C#1.0 までで

押さえておくこと4. C#2.0 と 3.0 の新機能5. Linq

Page 3: C# LINQ入門

1. はじめに

Page 4: C# LINQ入門

福井情報技術者協会

• http://fitea.org• 福井の IT産業に関わる技術者の「横のつながり」を

支援するコミュニティ FITEA のミッション

– 『私たちは、福井をソフトウェア大国にするべく積極的に活動を行い、福井の情報技術者を心豊か、スキル豊か、フトコロ豊かにします』

主な活動– 技術的なセミナーの誘致、自主開催、および技術者同

士の交流会 (飲み会等 ) の開催

Page 5: C# LINQ入門

自己紹介

• 小島 富治雄• 福井コンピュータ株式会社• Microsoft MVP for Development Tools - Visual C#

英会話 ジャグリング

自転車通勤 万年筆

マイブーム

Page 6: C# LINQ入門

自己紹介タイム

• 名前• 所属や出身など• C# で好きなところ

Page 7: C# LINQ入門

2. C# のこれから

Page 8: C# LINQ入門

Anders Hejlsberg

Page 9: C# LINQ入門

Anders Hejlsberg 談 :C# の今後について

2006/02/02 at 横浜

Q. 今後 C# は、関数型言語として進化していくのか ?

A. Yes. C#3.0 や LINQ で導入された「ラムダ式」などの機能は、 Haskell や ML などの関数型言語に触発されたものだ。これらの機能は開発をもっと自由な形にする。設計しているだけでワクワクするような機能だ。C# 3.0 というのは、オブジェクト指向言語と関数型言語の「ハッピーな結婚」といってよいものになるだろう。

Page 10: C# LINQ入門

Anders Hejlsberg 談 :C# の今後について

Q. AOP ( アスペクト指向プログラミング ) 機能 ( =オブジェクトに対して後付けで機能を挿入する仕組み ) を提供する予定は ?

A. AOP は、個人的には懐疑的。 AOP が役立つ場面もあるが副作用もある。

C# の機能 ( 属性や Partial Class) で代用できるケースも多い。

Page 11: C# LINQ入門
Page 12: C# LINQ入門

3. C#1.0 までで押さえておくこと

Page 13: C# LINQ入門

C#1.0 までで押さえておくところ

• .NET らしい Cool な書き方–delegate と event–データバインド– 属性 ( アノテーション )

Page 14: C# LINQ入門

• Demo–委譲による分割

→MVC 構造など–データバインド

• 双方向依存→ interface 、 delegate 、 event によるデータバインド

Page 15: C# LINQ入門

+ 追加() : void

+ <<event>> Changed : Action<T>

Data

+ OnChanged() : void

DrawingUI

+ <<event>> Changed : Action<T>

<<interface>>IDataSource<T>

<<interface>>IEnumerable<T>

<<realize>>

DataSource

interface IDataSource<T> : IEnumerable<T>{ event Action<T> Changed;}

class Data<T> : IDataSource<T>{ List<T> list = new List<T>();

public event Action<T> Changed;

public void Add(T item) { list.Add(item); if (Changed != null) Changed(item); }

public IEnumerator<T> GetEnumerator() { return list.GetEnumerator(); }

IEnumerator IEnumerable.GetEnumerator() { return list.GetEnumerator(); }}

interface IDrawable{ void Draw();}

class DrawingUI<T> : UserControl where T : IDrawable{ IDataSource<T> dataSource = null;

public IDataSource<T> DataSource { set { dataSource = value; value.Changed += OnChanged; } private get { return dataSource; } }

public void Draw() { if (DataSource != null) DataSource.ForEach(item => item.Draw()); }

void OnChanged(T item) { item.Draw(); }}

データバインド

Page 16: C# LINQ入門

+ 追加() : void

+ <<event>> Changed : Action<T>

Data

+ OnChanged() : void

DrawingUI

IDataSource<T>

DataSource

<<realize>>

Application

- drawingUI

- data

データバインドdrawingUI.DataSource = data;

Page 17: C# LINQ入門

• Demo–C#2.0 、 3.0 による進化–オブジェクトへの委譲 → メソッド

への委譲• class → delegate → 匿名メソッド ( クロージャ ) → ラムダ式

• yield による継続

Page 18: C# LINQ入門

3. C#2.0 と 3.0 の新機能

Page 19: C# LINQ入門

C#2.0• Generics• 匿名メソッド• イテレータ (yield)• Partial Type• Nullable 型• アクセサのアクセスレベル• static クラス• namespace alias qualifier• extern alias• #pragma• Conditional 属性• 固定長配列• デリゲートの Covariance/Contravariance

Page 20: C# LINQ入門

C#3.0• 暗黙的型付け• パーシャルメソッド• 自動プロパティ• オブジェクト イニシャライザ• コレクション イニシャライザ• 暗黙型付け配列• 匿名型 (Anonymous Types)• 拡張メソッド• ラムダ式 (Lambda Expression)• LINQ

Page 21: C# LINQ入門

Demo

Page 22: C# LINQ入門

・多くがシンタックス シュガー

・当たり前だが、使わなくてもプログラムは書ける

C#2.0 と 3.0 の新機能について

Page 23: C# LINQ入門

C#2.0 と 3.0 の新機能について• A: 「 C#3.0 の方が簡潔に意図を表現できる」• B: 「でも C# 3.0 の文法がなくても、同じことは書ける。新たな文法

を採用しなくても、要は、書ければなんでもいいのであって」• A: 「それって、極端な言い方をすれば、アセンブリ言語があれば、他の

言語は不要ってこと ? 」

• A: 「より意図をシンプルに書く方法ができたのなら、それは採用したいな」

• B: 「新しいものを取り入れるのにはリスクがある」• A: 「『新しいものを取り入れない』リスクほどではないと思う」• A: 「 ITエンジニアは、鮫みたいなもので、前に進むのを止めたら死ん

でしまう」

• B: 「色々覚えるのは大変だ」• A: 「確かに。でも、使わなきゃならなくなったわけではない。選択肢が増えただけ。今までのものを置き換えなきゃいけないわけでもない」

Page 24: C# LINQ入門

「きれいなコードは好きですか?」

~品質の高いソースコードを書くコツ~

意図を表現編

Page 25: C# LINQ入門

C#2.0

C#3.0 への布石

• Generics• 匿名メソッド• イテレータ (yield)• static クラス

Page 26: C# LINQ入門

Generics• C++ で言うところの template に似ている• “型をパラメータに持つ型”を作る

class Stack<T>{ List<T> items = new List<T>();

public void Push(T item) { items.Insert(0, item); }

public T Pop() { T item = items[0]; items.RemoveAt(0); return item; }}

Demo:

Page 27: C# LINQ入門

匿名メソッド• インラインにメソッドを記述• ブロック スコープをデリゲートに

( =クロージャ )

static void Sample3(string captionText){ userInput.KeyInput += delegate(string inputText) { string text = “ユーザー入力 : "; MessageBox.Show(text + inputText, captionText); };}

Demo:

Page 28: C# LINQ入門

イテレータ (yield)• Enumerable や IEnumerator インタフェース

(foreach などに必要) を簡単に作成

class 自然数{ readonly int max = 1;

public 自然数(int max) { this.max = max; }

public IEnumerator<int> GetEnumerator() { for (int number = 1; number <= max; number++) yield return number; }}

Demo:

Page 29: C# LINQ入門

C#3.0

•より簡潔に意図が記述できるようになった

•Linq がメイン–ほとんどの新機能は Linq に通じる

Page 30: C# LINQ入門

暗黙的型付け (var)

• 型がなくなるわけじゃない• object で受けるのとは違う

–インテリセンスが利く

var point = new { X=100, Y=200 };

Demo:

Page 31: C# LINQ入門

パーシャルメソッド• メソッドの宣言と定義を分離• 実装があれば実行、なければ何もしない

partial class PertialMethodSample{ static partial void DoSomething();

static void Main(string[] args) { DoSomething(); }}

partial class PertialMethodSample{ static partial void DoSomething() { Console.WriteLine("DoSomething"); }}

Demo:

Page 32: C# LINQ入門

自動プロパティ// 1.0~2.0string name;

public string Name{ get { return name; } set { name = value; }}

// 3.0public string Name { get; set; }

Page 33: C# LINQ入門

オブジェクト イニシャライザ• インスタンス化とプロパティ設定を一行で

// 1.0~2.0

// プロパティをひとつずつ設定Point point = new Point();point.X = 1;point.Y = 2;

// またはコンストラクタを作成してPoint point = new Point(1, 2);

// 3.0var point = new Point { X = 1, Y = 2 };

Page 34: C# LINQ入門

コレクション イニシャライザ• ICollection<T> を配列感覚で初期化

// 1.0~2.0List<Point> list = new List<Point>();list.Add(new Point(10, 20));list.Add(new Point( 0, 0));list.Add(new Point(30, 10));

// 3.0var list = new List<Point> { new Point { X = 10, Y = 20 }, new Point { X = 0, Y = 0 }, new Point { X = 30, Y = 10 },};

Page 35: C# LINQ入門

暗黙型付け配列

• new で配列を作成するときに型を省略

var array = new[] {1, 2, 3, 4};

Page 36: C# LINQ入門

匿名型 (Anonymous Types)

•無名クラス

var book = new { タイトル = “C#3.0 入門” , 価格 = 2980};Console.WriteLine(book);

Page 37: C# LINQ入門

拡張メソッド• 既存クラスにインスタンスメソッドを追加

public static void 回 (this int 回数 , Action やる ){ for (int カウント = 0; カウント < 回数 ; カウント ++) やる ();}

// 使い方10.回 (海に向かって叫ぶ );

Demo:

Page 38: C# LINQ入門

ラムダ式 (Lambda Expression)

• 匿名メソッドの発展形

Func<int, int, int> funcA = delegate(int x, int y) { return x + y; };Func<int, int, int> funcL = (x, y) => x + y;

Action actionA = delegate { Console.WriteLine("Hello"); };Action actionL = () => Console.WriteLine("Hello");

Console.WriteLine(funcA(1, 2));Console.WriteLine(funcL(1, 2));actionA();actionL();

Demo:

Page 39: C# LINQ入門

5. Linq

Page 40: C# LINQ入門

Linq概要

• LinqLanguage-INtegrated Query( 言語に統合されたクエリ )

Page 41: C# LINQ入門

Linq とは

• データの集合から簡単な記述で『必要なオブジェクト』の『必要なメンバ』のみを『必要とする順序』で取り出せるようにしたシンタックスシュガー– 開発者は抽出条件、抽出するメンバ、抽出順序にのみ関

心を払う– 取り出すデータの型不要– 繰り返し文不要

var query = from データ変数 in データの集合   where 抽出条件   orderby 抽出順序のキー項目   select 抽出するメンバ で構成される新しいクラス ;

Page 42: C# LINQ入門

Linq の種類

.NET LINQ

LINQ to Objects

LINQ to Datasets LINQ to SQL LINQ to

Entities LINQ to XML

C# VB その他の言語

ObjectData Base

XML

Page 43: C# LINQ入門

データベース関連の Linq

• データベース周りの Linq

Data Base

.NET LINQ

LINQ to DataSets LINQ to SQL LINQ to

Entities

ADO.NETEntity Client

Entity Framework

Dataset

Table Adapter

Data Context

Page 44: C# LINQ入門

Linq to Object

var bookList = new[] { new { タイトル = "C# 入門 " , ISBN コード = "AAAAAAA", 価格 = 2980 }, new { タイトル = "VB 入門 " , ISBN コード = "BBBBBBB", 価格 = 3300 }, new { タイトル = ".NET Framework", ISBN コード = "CCCCCCC", 価格 = 7800 } };

var books = from aBook in bookList where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル , 価格 = aBook.価格 }; books.ForEach(item => Console.WriteLine(item));

•IEnumerable<T> なオブジェクトをクエリ

Page 45: C# LINQ入門

Linq to DataSet

var ds = new DataSet();testTableAdapter.Fill(ds);var accounts = from aBook in ds.Book where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル , 価格 = aBook.価格 };books.ForEach(item => Console.WriteLine(item));

•DataSet をクエリ

Page 46: C# LINQ入門

Linq to SQL

using (var db = new DataClasses1DataContext()) { var accounts = from aBook in db.Book where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル , 価格 = aBook.価格 }; books.ForEach(item => Console.WriteLine(item));}

•SQL Server のデータベースをクエリ

Page 47: C# LINQ入門

LINQ to SQL の特長

• 生成される SQL 文はパラメータクエリ

• 追加/更新/削除時には自動的にトランザクションになる–DataContext.SubmitChanges()–Linq ではなく DataContext クラスの

機能

Page 48: C# LINQ入門

Linq to SQL

Demo

Page 49: C# LINQ入門

Linq to Entities

• Entity Framework による概念エンティティをクエリ

var accounts = from aBook in textContext.Book where aBook.ISBN コード == "BBBBBBB" select new { タイトル = aBook. タイトル , 価格 = aBook.価格 };books.ForEach(item => Console.WriteLine(item));

Page 50: C# LINQ入門

Linq to XML

• XML の Xelement をクエリ–RSS の読み込みなどに便利

var xElement = XElement.Load("../../Books.xml"); var books = from aBook in xElement.Elements() where aBook.Element("ISBN コード ").Value == "BBBBBBB" select new { タイトル = aBook.Attribute(" タイトル ").Value, 価格 = int.Parse(aBook.Element(" 価格 ").Value) }; books.ForEach(item => Console.WriteLine(item));

Page 51: C# LINQ入門

Linq to XML

Demo

Page 52: C# LINQ入門

ASP.NET での LINQ

• LinqDataSource コントロール–LINQ to SQL だけでなく各種オ

ブジェクトが利用可能

Page 53: C# LINQ入門

Linq とは何か

  IEnumerable<T> ベースのすべての情報ソースにクエリを適用する技術

Page 54: C# LINQ入門

Linq とは何ではないか

「 SQL が C# や VB で書けるようになった」のではない

Page 55: C# LINQ入門

C#3.0 と Linq の関係

• C#3.0 の言語拡張の多くは Linq のため

Demo:

Page 56: C# LINQ入門

Linq の特長

• Expression Tree–IQueryable<T>

Demo:

Page 57: C# LINQ入門

クエリ式

• From 句からはじまる• from 、 let 、 where 、 join 、 orderb

y を内部に記述• Select 句または group 句で終わる

• add/update/delete は仕様として存在しない–データを抽出することが目的

Page 58: C# LINQ入門

クエリ式

• where (抽出条件 )– where book. タイトル .Contains(“.NET”)– where book.価格 < 2000

• orderby (抽出順序 )–orderby book. タイトル–orderby book.価格 descending–orderby book. タイトル , book.価格

Page 59: C# LINQ入門

LINQ の仕組み

• クエリ式はラムダ式を引数にとる拡張メソッドが連結された形式に変換される

var query = from book in bookse where book. タイトル .Contans(“C#”) orderby book. タイトル select new { book. タイトル , book. 価格 };

var query = books.Where(book => book. タイトル .Contans(“C#”)).OrderBy(book => book. タイトル ).Select(book => new {book. タイトル ,

book. 価格 });

Page 60: C# LINQ入門

LINQ の仕組み

• System.LINQ.Enumerable.XXX– LINQ to Object

• 配列や List<T> などは IEnumerable から派生– LINQ to XML

• Xelement.Decentants() が IEnumerable を返す– yield による実装 → 遅延実行

• System.LINQ.Queryable.XXX– LINQ to SQL

• System.Data.Linq.Table<T> は IQueryable から派生– ラムダ式の右辺を積んで式のツリー( Expression Tree )を

作成– IQuaryProvider による実装 → 遅延実行– 継承して独自の LINQ to XXX といった仕組みを構築可能

Page 61: C# LINQ入門

LINQ の仕組み

• 遅延実行– データが実際に必要となるタイミングまでクエリ条件

が積み重ねられる• LINQ to SQL では最終的にデータを参照するタイミング

(DataBind 時など) にSQL文が生成される

var query1 = from book in db.書籍 orderby book.タイトル select new { 出版社名 = book.出版社.名前, 書籍タイトル = book.タイトル };var query2 = from book in query1 where book.出版社名.Contains("C") select book;

query2.ToList().ForEach(book => Console.WriteLine(book));

SELECT [t1].[名前] AS [出版社名], [t0].[タイトル] AS [書籍タイトル]FROM [dbo].[書籍] AS [t0]LEFT OUTER JOIN [dbo].[出版社] AS [t1] ON [t1].[ID] = [t0].[出版社ID]WHERE [t1].[名前] LIKE @p0ORDER BY [t0].[タイトル]

Page 62: C# LINQ入門

LINQ による異種データの結合

• Object 、 XML 、 SQL を JOIN可能–IEnumerable ベースで結合

•データベース連携の部分では全データを取り出してから必要なものを抽出–LINQ to SQL を IEnumerable ベー

スで処理

Page 63: C# LINQ入門

Linq と ADO.NET の関係

• ADO.NET の進化–ADO.NET 1.0–ADO.NET 2.0–ADO.NET 3.0–ADO.NET 3.5

Page 64: C# LINQ入門

ADO.NET

• 1.0–Transaction Script

• SqlConnecion + SqlCommand

–Table Module• SqlDataAdapter で

DataSet や DataTable

Page 65: C# LINQ入門

ADO.NET

• 2.0–Table Module

• SqlDataSource• ObjectDataSource で

型付き DataSet と専用TableAdapter

Page 66: C# LINQ入門

ADO.NET• 3.0

–Domain Model• Linq to SQL で O-R マッピング

データベース

オブジェクト

Page 67: C# LINQ入門

ADO.NET

• 3.5–Domain Model

• Linq to Entities で O-R マッピング物理データモデル

論理データモデル

概念データモデル

概念データクエリ

Page 68: C# LINQ入門

参考情報

– C#3.0 の概要• http://www.microsoft.com/japan/msdn/net/bb308966.aspx

– LINQ : .NET 統合言語クエリ• http://www.microsoft.com/japan/msdn/net/bb308959.aspx

– .NET 標準クエリ演算子• http://www.microsoft.com/japan/msdn/net/bb394939.aspx

Page 69: C# LINQ入門

Hokuriku.NET Vol.7 in 福井

2011年7月30日(土) 13:30~19:00 アオッサ6F 研修室601B

(福井県福井市手寄1丁目4、JR福井駅から徒歩1分)

参加費: 500円程度のカンパをお願いしています (学生の方は無料です)

主催/共催: 北陸エンジニアグループ、福井情報技術者協会 (FITEA)

内容:– マイクロソフトのエバンジェリストやMVPが来福。最新のマイ

クロソフト技術を解説。– ライトニングトークスのトーカー募集中。

詳細/申込先:– Hokuriku.NET Vol.7 in 福井 : ATND (http://

atnd.org/events/16219) まで