c# linq入門
DESCRIPTION
2011/06/11 Hokuriku.NET C# LINQ入門http://atnd.org/events/15800TRANSCRIPT
Hokuriku.NET
C# LINQ 入門
2011/06/11小島 富治雄
福井コンピュータ株式会社
Agenda
1. はじめに2. C# のこれから3. C#1.0 までで
押さえておくこと4. C#2.0 と 3.0 の新機能5. Linq
1. はじめに
福井情報技術者協会
• http://fitea.org• 福井の IT産業に関わる技術者の「横のつながり」を
支援するコミュニティ FITEA のミッション
– 『私たちは、福井をソフトウェア大国にするべく積極的に活動を行い、福井の情報技術者を心豊か、スキル豊か、フトコロ豊かにします』
主な活動– 技術的なセミナーの誘致、自主開催、および技術者同
士の交流会 (飲み会等 ) の開催
自己紹介
• 小島 富治雄• 福井コンピュータ株式会社• Microsoft MVP for Development Tools - Visual C#
英会話 ジャグリング
自転車通勤 万年筆
マイブーム
自己紹介タイム
• 名前• 所属や出身など• C# で好きなところ
2. C# のこれから
Anders Hejlsberg
Anders Hejlsberg 談 :C# の今後について
2006/02/02 at 横浜
Q. 今後 C# は、関数型言語として進化していくのか ?
A. Yes. C#3.0 や LINQ で導入された「ラムダ式」などの機能は、 Haskell や ML などの関数型言語に触発されたものだ。これらの機能は開発をもっと自由な形にする。設計しているだけでワクワクするような機能だ。C# 3.0 というのは、オブジェクト指向言語と関数型言語の「ハッピーな結婚」といってよいものになるだろう。
Anders Hejlsberg 談 :C# の今後について
Q. AOP ( アスペクト指向プログラミング ) 機能 ( =オブジェクトに対して後付けで機能を挿入する仕組み ) を提供する予定は ?
A. AOP は、個人的には懐疑的。 AOP が役立つ場面もあるが副作用もある。
C# の機能 ( 属性や Partial Class) で代用できるケースも多い。
3. C#1.0 までで押さえておくこと
C#1.0 までで押さえておくところ
• .NET らしい Cool な書き方–delegate と event–データバインド– 属性 ( アノテーション )
例
• Demo–委譲による分割
→MVC 構造など–データバインド
• 双方向依存→ interface 、 delegate 、 event によるデータバインド
+ 追加() : 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(); }}
データバインド
+ 追加() : void
+ <<event>> Changed : Action<T>
Data
+ OnChanged() : void
DrawingUI
IDataSource<T>
DataSource
<<realize>>
Application
- drawingUI
- data
データバインドdrawingUI.DataSource = data;
例
• Demo–C#2.0 、 3.0 による進化–オブジェクトへの委譲 → メソッド
への委譲• class → delegate → 匿名メソッド ( クロージャ ) → ラムダ式
• yield による継続
3. C#2.0 と 3.0 の新機能
C#2.0• Generics• 匿名メソッド• イテレータ (yield)• Partial Type• Nullable 型• アクセサのアクセスレベル• static クラス• namespace alias qualifier• extern alias• #pragma• Conditional 属性• 固定長配列• デリゲートの Covariance/Contravariance
C#3.0• 暗黙的型付け• パーシャルメソッド• 自動プロパティ• オブジェクト イニシャライザ• コレクション イニシャライザ• 暗黙型付け配列• 匿名型 (Anonymous Types)• 拡張メソッド• ラムダ式 (Lambda Expression)• LINQ
Demo
・多くがシンタックス シュガー
・当たり前だが、使わなくてもプログラムは書ける
C#2.0 と 3.0 の新機能について
C#2.0 と 3.0 の新機能について• A: 「 C#3.0 の方が簡潔に意図を表現できる」• B: 「でも C# 3.0 の文法がなくても、同じことは書ける。新たな文法
を採用しなくても、要は、書ければなんでもいいのであって」• A: 「それって、極端な言い方をすれば、アセンブリ言語があれば、他の
言語は不要ってこと ? 」
• A: 「より意図をシンプルに書く方法ができたのなら、それは採用したいな」
• B: 「新しいものを取り入れるのにはリスクがある」• A: 「『新しいものを取り入れない』リスクほどではないと思う」• A: 「 ITエンジニアは、鮫みたいなもので、前に進むのを止めたら死ん
でしまう」
• B: 「色々覚えるのは大変だ」• A: 「確かに。でも、使わなきゃならなくなったわけではない。選択肢が増えただけ。今までのものを置き換えなきゃいけないわけでもない」
「きれいなコードは好きですか?」
~品質の高いソースコードを書くコツ~
意図を表現編
C#2.0
C#3.0 への布石
• Generics• 匿名メソッド• イテレータ (yield)• static クラス
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:
匿名メソッド• インラインにメソッドを記述• ブロック スコープをデリゲートに
( =クロージャ )
static void Sample3(string captionText){ userInput.KeyInput += delegate(string inputText) { string text = “ユーザー入力 : "; MessageBox.Show(text + inputText, captionText); };}
Demo:
イテレータ (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:
C#3.0
•より簡潔に意図が記述できるようになった
•Linq がメイン–ほとんどの新機能は Linq に通じる
暗黙的型付け (var)
• 型がなくなるわけじゃない• object で受けるのとは違う
–インテリセンスが利く
var point = new { X=100, Y=200 };
Demo:
パーシャルメソッド• メソッドの宣言と定義を分離• 実装があれば実行、なければ何もしない
partial class PertialMethodSample{ static partial void DoSomething();
static void Main(string[] args) { DoSomething(); }}
partial class PertialMethodSample{ static partial void DoSomething() { Console.WriteLine("DoSomething"); }}
Demo:
自動プロパティ// 1.0~2.0string name;
public string Name{ get { return name; } set { name = value; }}
// 3.0public string Name { get; set; }
オブジェクト イニシャライザ• インスタンス化とプロパティ設定を一行で
// 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 };
コレクション イニシャライザ• 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 },};
暗黙型付け配列
• new で配列を作成するときに型を省略
var array = new[] {1, 2, 3, 4};
匿名型 (Anonymous Types)
•無名クラス
var book = new { タイトル = “C#3.0 入門” , 価格 = 2980};Console.WriteLine(book);
拡張メソッド• 既存クラスにインスタンスメソッドを追加
public static void 回 (this int 回数 , Action やる ){ for (int カウント = 0; カウント < 回数 ; カウント ++) やる ();}
// 使い方10.回 (海に向かって叫ぶ );
Demo:
ラムダ式 (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:
5. Linq
Linq概要
• LinqLanguage-INtegrated Query( 言語に統合されたクエリ )
Linq とは
• データの集合から簡単な記述で『必要なオブジェクト』の『必要なメンバ』のみを『必要とする順序』で取り出せるようにしたシンタックスシュガー– 開発者は抽出条件、抽出するメンバ、抽出順序にのみ関
心を払う– 取り出すデータの型不要– 繰り返し文不要
var query = from データ変数 in データの集合 where 抽出条件 orderby 抽出順序のキー項目 select 抽出するメンバ で構成される新しいクラス ;
Linq の種類
.NET LINQ
LINQ to Objects
LINQ to Datasets LINQ to SQL LINQ to
Entities LINQ to XML
C# VB その他の言語
ObjectData Base
XML
データベース関連の 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
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> なオブジェクトをクエリ
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 をクエリ
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 のデータベースをクエリ
LINQ to SQL の特長
• 生成される SQL 文はパラメータクエリ
• 追加/更新/削除時には自動的にトランザクションになる–DataContext.SubmitChanges()–Linq ではなく DataContext クラスの
機能
Linq to SQL
Demo
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));
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));
Linq to XML
Demo
ASP.NET での LINQ
• LinqDataSource コントロール–LINQ to SQL だけでなく各種オ
ブジェクトが利用可能
Linq とは何か
IEnumerable<T> ベースのすべての情報ソースにクエリを適用する技術
Linq とは何ではないか
「 SQL が C# や VB で書けるようになった」のではない
C#3.0 と Linq の関係
• C#3.0 の言語拡張の多くは Linq のため
Demo:
Linq の特長
• Expression Tree–IQueryable<T>
Demo:
クエリ式
• From 句からはじまる• from 、 let 、 where 、 join 、 orderb
y を内部に記述• Select 句または group 句で終わる
• add/update/delete は仕様として存在しない–データを抽出することが目的
クエリ式
• where (抽出条件 )– where book. タイトル .Contains(“.NET”)– where book.価格 < 2000
• orderby (抽出順序 )–orderby book. タイトル–orderby book.価格 descending–orderby book. タイトル , book.価格
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. 価格 });
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 といった仕組みを構築可能
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].[タイトル]
LINQ による異種データの結合
• Object 、 XML 、 SQL を JOIN可能–IEnumerable ベースで結合
•データベース連携の部分では全データを取り出してから必要なものを抽出–LINQ to SQL を IEnumerable ベー
スで処理
Linq と ADO.NET の関係
• ADO.NET の進化–ADO.NET 1.0–ADO.NET 2.0–ADO.NET 3.0–ADO.NET 3.5
ADO.NET
• 1.0–Transaction Script
• SqlConnecion + SqlCommand
–Table Module• SqlDataAdapter で
DataSet や DataTable
ADO.NET
• 2.0–Table Module
• SqlDataSource• ObjectDataSource で
型付き DataSet と専用TableAdapter
ADO.NET• 3.0
–Domain Model• Linq to SQL で O-R マッピング
データベース
オブジェクト
ADO.NET
• 3.5–Domain Model
• Linq to Entities で O-R マッピング物理データモデル
論理データモデル
概念データモデル
概念データクエリ
参考情報
– 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
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) まで