Linq プラットホームベンダー の情熱(を感じる)

37
わわわわわわ わわわわわ #14 Linq わわわわわわわわわわわ わわわ わわわわわ () わわわわ わわわわわ () Microsoft MVP for Visual- Developer C# 2005/01- 2007/12

description

Linq プラットホームベンダー の情熱(を感じる). えムナウ(児玉宏之) Microsoft MVP for Visual-Developer C# 2005/01-2007/12. アジェンダ. はじめに Linq の概要 C#3.0 と Linq の関係 Entity Data Model まとめ. はじめに. データを簡単にオブジェクトとして扱いたい Microsoft はこれまでに何をやったか DataSet を作ってみた データベースをメモリ上で再現できたが Object じゃない DataSet デザイナとか作ってみた - PowerPoint PPT Presentation

Transcript of Linq プラットホームベンダー の情熱(を感じる)

Page 1: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linqプラットホームベン

ダーの情熱(を感じる)

えムナウ(児玉宏之)Microsoft MVP for Visual-

Developer C# 2005/01-2007/12

Page 2: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

アジェンダ

• はじめに• Linq の概要• C#3.0 と Linq の関係• Entity Data Model

• まとめ

Page 3: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

はじめに

• データを簡単にオブジェクトとして扱いたいMicrosoft はこれまでに何をやったか

– DataSet を作ってみた• データベースをメモリ上で再現できたが Object じゃな

– DataSet デザイナとか作ってみた• 手軽で便利になったけど Object じゃない

– Partial で拡張できるようにした• DataSet 、 DataTable 、 DataRow 、 TableAdapter に、

拡張できてプロパティとかメソッドとか作れるようにはなって Object っぽくなってきたけど作るのは大変。

Page 4: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• Linq とは

.Net Framework 上の「言語に統合されたクエリ」(Language-INtegrated Query)の拡張セットを指すコードネームの名称。

Page 5: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• Linq の種類

.NET LINQ.NET LINQ

LINQ to ObjectsLINQ to Objects

LINQ to DatasetsLINQ to Datasets

LINQ to SQL

LINQ to SQL

LINQ to EntitiesLINQ to Entities

LINQ to XML

LINQ to XML

C#C# VBVB その他の言語その他の言語

ObjectObjectData BaseData Base

XMLXML

Page 6: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• データベース周りの Linq

Data BaseData Base

.NET LINQ.NET LINQ

LINQ to DatasetsLINQ to Datasets

LINQ to SQL

LINQ to SQL

LINQ to EntitiesLINQ to Entities

ADO.NETADO.NETEntity ClientEntity Client

Entity Framework

Entity Framework

DatasetDataset

Table AdapterTable

Adapter

Data Context

Data Context

Page 7: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• Linq to Objects

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

var al = new [] { new {Name="hnaka",ZipCode="553-0001",Prefecture=" 大阪府 "}, new {Name="hkodama",ZipCode="168-0064",Prefecture=" 東京都 "}};var accounts = from a in al where a.ZipCode == "168-0064" select new { a.Name, a.ZipCode };foreach (var account in accounts){ Console.WriteLine(account.Name+ "(" + account.ZipCode + ")");}

Page 8: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• Linq to DataSet

 従来の ADO.NET の DataSet のすべての情報ソースにクエリを適用

DataSet al = new DataSet();testTableAdapter.Fill(al);var accounts = from a in al.Account where a.ZipCode == "168-0064" select new { Name = a.Name, ZipCode = a.ZipCode };foreach (var account in accounts){ Console.WriteLine(account.Name+ "(" + account.ZipCode + ")");}

Page 9: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• Linq to SQL

  SQL サーバーのデータベースのすべての情報ソースにクエリを適用

using (DataClasses1DataContext db = new DataClasses1DataContext(Linq1.Properties.Settings.Default.TESTConnectionString))

{ var accounts = from a in db.Account where a.ZipCode == "168-0064" select a;   foreach (Account account in accounts) { Console.WriteLine(account.Name + "(" + account.ZipCode + ")"); }}

Page 10: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• Linq to Entities

  Entity Framework を通した概念エンティティの情報ソースにクエリを適用

var accounts = from a in textContext.Account where a.ZipCode == "168-0064" select a;foreach (Account account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 11: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• Linq to XML

  XML の XElement のすべての情報ソースにクエリを適用

var al = new XElement(“Account”, new XAttribute(“CanCode”, true), new XElement(“Name”, “ hkodama”), new XElement(“ZipCode”, “168-0064”), new XElement(“Prefecture”, “ 東京都” ));var accounts = from a in al where a.ZipCode == "168-0064"

select new Account { Name = a.Attribute(“Name”), ZipCode = a.Attribute("ZipCode") };

foreach (var account in accounts){ Console.WriteLine(account.Name+ "(" + account.ZipCode + ")");}

Page 12: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Linq 概要

• まとめ– 一般に .NetFramework でデータとして扱うす

べてが対象名称 対象

Linq to Objects IEnumerable<T>

Linq to DataSet ADO.NET の DataSet

Linq to SQL SQL サーバーのデータベース

Linq to Entities Entity Framework を通した概念エンティティ

Linq to XML XML の XElement

Page 13: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• C#3.0 の言語拡張– 暗黙に型付けされたローカル変数– 拡張メソッド– ラムダ式– オブジェクト初期化子および コレクション

初期化子– 匿名型– クエリ式– パーシャルメソッド

Page 14: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• C#2.0 で書いてみたList<MyAccount> al = new List<MyAccount>();al.Add(new MyAccount("hnaka", "553-0001", " 大阪府 "));al.Add(new MyAccount("hkodama", "168-0064", " 東京都 "));

IEnumerable<MyAccount2> accounts = EnumerableExtensions<MyAccount, MyAccount2>.Select( EnumerableExtensions<MyAccount, MyAccount2>.Where (al, delegate(MyAccount a) { return a.ZipCode == "168-0064"; }), delegate(MyAccount a) { return new MyAccount2(a.Name, a.ZipCode); } );

Console.WriteLine("C#2.0");foreach (MyAccount2 account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 15: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

Page 16: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

Page 17: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

Page 18: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• 暗黙に型付けされたローカル変数var al = new List<MyAccount>();al.Add(new MyAccount("hnaka", "553-0001", " 大阪府 "));al.Add(new MyAccount("hkodama", "168-0064", " 東京都 "));

var accounts = EnumerableExtensions<MyAccount, MyAccount2>.Select( EnumerableExtensions<MyAccount, MyAccount2>.Where (al, delegate(MyAccount a) { return a.ZipCode == "168-0064"; }), delegate(MyAccount a) { return new MyAccount2(a.Name, a.ZipCode); } );

Console.WriteLine("C#3.0 暗黙に型付けされたローカル変数 ");foreach (var account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 19: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• 拡張メソッドvar al = new List<MyAccount>();al.Add(new MyAccount("hnaka", "553-0001", " 大阪府 "));al.Add(new MyAccount("hkodama", "168-0064", " 東京都 "));

var accounts = al .Where(delegate(MyAccount a) { return a.ZipCode == "168-0064"; }) .Select(delegate(MyAccount a) { return new MyAccount2(a.Name, a.ZipCode); });

Console.WriteLine("C#3.0 拡張メソッド ");foreach (var account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 20: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係static class EnumerableExtension{ public delegate TD SelectFunc<TS, TD>(TS t); public static IEnumerable<TD> Select<TS, TD>

(this IEnumerable<TS> e, SelectFunc<TS, TD> f) { foreach (TS i in e) { yield return f(i); } } public static IEnumerable<TS> Where<TS>

(this IEnumerable<TS> e, Predicate<TS> p) { foreach (TS i in e) { if (p(i)) yield return i; } }}

Page 21: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• ラムダ式var al = new List<MyAccount>();al.Add(new MyAccount("hnaka", "553-0001", " 大阪府 "));al.Add(new MyAccount("hkodama", "168-0064", " 東京都 "));

var accounts = al .Where(a => a.ZipCode == "168-0064") .Select(a => new MyAccount2(a.Name, a.ZipCode));

Console.WriteLine("C#3.0 ラムダ式 ");foreach (var account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 22: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• オブジェクト初期化子および コレクション初期化子var al = new List<MyAccount> {

new MyAccount{Name="hnaka",ZipCode="553-0001",Prefecture=" 大阪府 "}, new MyAccount{Name="hkodama",ZipCode="168-0064",Prefecture=" 東京都 "}};

var accounts = al .Where(a => a.ZipCode == "168-0064") .Select(a => new MyAccount2 { Name = a.Name, ZipCode = a.ZipCode });

Console.WriteLine("C#3.0 オブジェクト初期化子および コレクション初期化子 ");foreach (var account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 23: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• 匿名型var al = new [] { new {Name="hnaka",ZipCode="553-0001",Prefecture=" 大阪府 "}, new {Name="hkodama",ZipCode="168-0064",Prefecture=" 東京都 "}};

var accounts = al .Where(a => a.ZipCode == "168-0064") .Select(a => new { Name = a.Name, ZipCode = a.ZipCode });

Console.WriteLine("C#3.0 匿名型 ");foreach (var account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 24: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• クエリ式var al = new[] { new {Name="hnaka",ZipCode="553-0001",Prefecture=" 大阪府 "}, new {Name="hkodama",ZipCode="168-0064",Prefecture=" 東京都 "}};

var accounts = from a in al where a.ZipCode == "168-0064" select new { Name = a.Name, ZipCode = a.ZipCode };Console.WriteLine("C#3.0 クエリ式 ");foreach (var account in accounts){ Console.WriteLine(account.Name + "(" + account.ZipCode + ")");}

Page 25: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• パーシャルメソッド– Linq でカスタムプロパティ検証や挿入・更新・

削除メソッドの検証に使用するpublic partial class DataClasses1DataContext

{

public partial class Account

{

partial void OnZipCodeChanging(string value)

{

Regex zipcheck = new Regex(@“^[0-9]{3}-[0-9]{4}$”);

if (!zipcheck.IsMatch(value)) throw new Excepton(“ 郵便番号エラー” );

}

}

}

Page 26: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

C#3.0 と Linq の関係

• 結論– 言語拡張は Linq のためだった– 便利に短く書けるようになった

– from から先に書く– 型推論が働くので入力が簡単

– SQL 文とは順序が逆なので注意

Page 27: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• Linq は O/R マッピングか?– O/R マッピングはこんな感じ、じゃぁそう

じゃん。

Page 28: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

– Linq to Entities はこんな感じ

Page 29: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• Linq to Entities の構造

Page 30: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• 概念モデルは、概念スキーマ定義言語 (CSDL: Conceptual Schema Definition Language) を使用して XML ファイルに定義

• データベース スキーマを表す論理モデルは、ストア スキーマ定義言語 (SSDL: Store Schema Definition Language) を使って XML ファイルに定義

• マッピング層は、マッピング スキーマ言語 (MSL : Mapping Schema Language) を使用して定義

Page 31: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• 業務データモデル開発の流れ– 業務を分析して概念モデルを作る

• データの内容• データの分類と命名• データの操作

– 実際のデータベースに合わせ論理モデルを作る

• エンティティ(項目)• ドメイン(データ型)• キー• スーパータイプ・サブタイプ

Page 32: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• 業務データモデル開発の流れ– 実際のデータベースに適用する

• プライマリーキー• リレーション• 基本の型に合わせる• インデックス• トリガ• 容量試算や配置の考慮

Page 33: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• ソフトウェアエンジニアはデータベースに対してプログラムを作ってきた– これからはデータベースに向き合ってプログ

ラムを作る時代ではなくなった– 業務概念そのものに向き合ってプログラムを

作る時代になっていく

Page 34: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• Entity Framework の新技術たち

ADO.NETADO.NETEntity ClientEntity Client

Entity Framework( edmx ファイル)Entity Framework( edmx ファイル) CSDLCSDL MDLMDL SSDLSSDL

Entity ClientEntity Client Entity ClientEntity Client

LINQ to EntitiesLINQ to Entities

C#C# VBVB その他の言語その他の言語

AstoriaAstoria JasperJasper

Data BaseData Base

Page 35: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

Entity Data Model

• 結論– 業務概念そのものを相手にした設計が必要

– 概念レベル設計をしないデータベース設計がまかり通っているが概念レベル設計したほうがいい

– 概念レベル設計をきちんとやっておくとプログラムも作りやすくなる

– 新しい技術も生み出されてきている

Page 36: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

まとめ

• Microsoft はプラットフォームベンダーとしてデータの扱い方について試行錯誤しながら今日まで来た

• Linq を通じてデータの扱い方を統一することにした

• Linq to SQL を使って O/R マッピングについて考えた

• Linq to Entities でその上位概念からとらえることにした

Page 37: Linq プラットホームベンダー の情熱(を感じる)

わんくま同盟 大阪勉強会 #14

おつかれさまでした

参考になるページhttp://blogs.wankuma.com/chicasharp/

http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30/default.aspx?loc=jp

http://msdn.microsoft.com/msdnmag/issues/07/07/DataPoints/default.aspx?loc=jp

http://www.event-registration.jp/events/te07/special_session.htm