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

Similar documents
C# の現在・過去・未来

スライド 1

スライド 1

Microsoft認定資格問題集(70-483_demo)

.NET Framework 4.0 世代の Expression Trees

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

MVP for VB が語る C# 入門

Oracle SQL Developer Data Modeler

Seasar.NET入門

スライド 1

Microsoft Word - Android_SQLite講座_画面800×1280

tkk0408nari

WPF Bindingの威力

10-C.._241_266_.Z

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

とても使いやすい Boost の serialization

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

プログラミング基礎I(再)

データベース 【1:データベースシステムとは】

DAOの利用

Case 0 sqlcmdi.parameters("?tencode").value = Iidata(0) sqlcmdi.parameters("?tenname").value = Iidata(1) 内容を追加します sqlcmdi.executenonquery() Case Else

WCF と IIS を使用して OData プロデューサーを作成する

Prog2_12th

ADO.NETのアーキテクチャ

SharpShooter Reports.WPF 基本的な使い方 Last modified on: November 15, 2012 本ドキュメント内のスクリーンショットは英語表記ですが SharpShooter Reports JP( 日本語版 ) では日本語で表示されます

Microsoft PowerPoint - Pro110111

第2回講義

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

リレーショナルデータベース入門 SRA OSS, Inc. 日本支社 Copyright 2008 SRA OSS, Inc. Japan All rights reserved. 1

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

スライド 1

IT / KPI IT WF(XOML),BPEL WSDL XSD IT XSD WSDL BPEL XOML XML

GEC-Java

テスト 1/7 ページ プレポスト Visual Studio による Windows アプリの開発 ( 基礎編 ) 受講日程受講番号氏名 1.NET Framework に関する記述で 誤っているものを選びなさい 1..NET Framework に含まれる CLR は プログラミング言語に依存し

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

S2DaoでもN:Nできます

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  


Microsoft Word - PHP_SQLServer2012

目次 更新履歴... 1 はじめに... 3 レコードセット?... 3 準備... 5 SQL でデータを取得する... 6 データのループ処理... 7 列の値を取得する... 7 対象行を変更する (MoveFirst, MoveNext, MovePrevious, MoveLast)...

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

データアダプタ概要

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Microsoft PowerPoint ppt

d_appendixB-asp10appdev.indd

平成17年度大学院 知識システム特論

PowerPoint Presentation

DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別で

mylittleadmin for SQL Server 2005 mylittleadmin for SQL Server 2005 Installation Guide version 3.1 ( インストールガイド日本語版 ) 目次 概要... 2 インストール要件... 2 インストールと設

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

文字列操作と正規表現

ValueHolder... 9 Customer.java Oracle TopLink 10g(10.1.3) È Volume3 2

TopLink å SampleClient.java... 5 Ò readallsample() querysample() cachesample() Ç..

目次 はじめに... 3 システムの必要条件... 3 サンプルアプリケーションの作成... 3 手順 手順 手順 手順 手順 手順 終わりに... 23

基礎計算機演習 実習課題No6

1. 画面拡大ショートカット ショートカットキーで作業効率 UP [Ctrl]+[+]: 拡大 [Ctrl]+[-]: 縮小 [Ctrl]+ 0 : デフォルトに戻す (100%) オンライン製品ヘルプ 2

ALG ppt

SpringSecurity

PowerPoint プレゼンテーション

C#の基本

JavaプログラミングⅠ

基本サンプル

GEC-Java

untitled

CAC

WPF アプリケーションの 多言語切替

Oracle JDeveloper 10g ADF Creation Date: Jul 07, 2004 Last Update: Jul 08, 2004 Version 1.0

Oracle Lite Tutorial

Jude を DSL エディタとして使う -Jude API 活用法 年 11 月 14 日稚内北星学園大学東京サテライト校浅海智晴 本日のテーマ Why Jude API What Jude API How Jude API 1

Microsoft PowerPoint - prog03.ppt

java_servlet2_見本

V8.1新規機能紹介記事

PowerPoint プレゼンテーション

mySQLの利用

Visual Basic Oracle Database 11g Release 1

Oracleセキュア・エンタープライズ・サーチ

XML Consortium 2009/5/8 XML Consortium Enterprise2.0 アプリを支えるクラウド基盤としての Windows Azure XML コンソーシアム Web 2.0 部会 日立ソフト宮崎昭世 Microsoft MVP for Development Pl

デモで理解する Facebook アプリ開発のポイント シグマコンサルティング ( 株 ) 菅原英治

プラグイン


PowerPoint Presentation

Microsoft PowerPoint - chap10_OOP.ppt

NetCOBOL for .NET 応用編

Microsoft Word - Android_SQLite講座_画面800×1280

Visual Basic Oracle Database 11 Release 1

いまさら聞けないVB2008 ADO.NET超入門

目次 はじめに... 3 システムの必要条件... 4 ライセンス認証... 4 アクティベーション... 6 開発... 7 手順 1. アプリケーションの作成... 7 手順 2. データソースの作成と代入... 7 手順 3. テンプレートの作成 手順 4. レポートビューアの追加

JAVA入門

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

Prog1_15th

正規表現応用

早分かりS2Dao

Java - Visual Editor

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

Transcription:

Linq プラットホームベンダー の情熱 ( を感じる ) えムナウ ( 児玉宏之 ) Microsoft MVP for Visual- Developer C# 2005/01-2007/12

アジェンダ はじめに Linqの概要 C#3.0とLinqの関係 Entity Data Model まとめ

はじめに データを簡単にオブジェクトとして扱いたい Microsoft はこれまでに何をやったか DataSet を作ってみた データベースをメモリ上で再現できたが Object じゃない DataSet デザイナとか作ってみた 手軽で便利になったけど Object じゃない Partial で拡張できるようにした DataSet DataTable DataRow TableAdapter に 拡張できてプロパティとかメソッドとか作れるようにはなって Object っぽくなってきたけど作るのは大変

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

Linq 概要 Linq の種類 C# VB その他の言語.NET LINQ LINQ to Objects LINQ to Datasets LINQ to SQL LINQ to Entities LINQ to XML Object Data Base XML

Linq 概要 データベース周りの Linq.NET LINQ LINQ to Datasets LINQ to SQL LINQ to Entities Dataset Table Adapter ADO.NET Data Context Entity Client Entity Framework Data Base

Linq to Objects Linq 概要 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 + ")");

Linq to DataSet Linq 概要 従来の 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 + ")");

Linq to SQL Linq 概要 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 + ")");

Linq to Entities Linq 概要 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 + ")");

Linq to XML Linq 概要 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 + ")");

まとめ Linq 概要 一般に.NetFramework でデータとして扱うすべてが対象 名称 Linq to Objects 対象 IEnumerable<T> Linq to DataSet Linq to SQL Linq to Entities Linq to XML ADO.NETのDataSet SQLサーバーのデータベース Entity Framework を通した概念エンティティ XMLのXElement

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

C#2.0 で書いてみた C#3.0 と Linq の関係 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 + ")");

public class MyAccount public MyAccount() _name = ""; _zipcode = ""; _prefecture = ""; public MyAccount(string name, string zipcode, string prefecture) _name = name; _zipcode = zipcode; _prefecture = prefecture; private string _name; public string Name get return _name; C#3.0 と Linq の関係 set _name = value; private string _zipcode; public string ZipCode get return _zipcode; set _zipcode = value; private string _prefecture; public string Prefecture get return _prefecture; set _prefecture = value;

public class MyAccount2 public MyAccount2() _name = ""; _zipcode = ""; public MyAccount2(string name, string zipcode) _name = name; _zipcode = zipcode; C#3.0 と Linq の関係 private string _name; public string Name get return _name; set _name = value; private string _zipcode; public string ZipCode get return _zipcode; set _zipcode = value;

static class EnumerableExtensions <TS, TD> public delegate TD SelectFunc(TS t); public static IEnumerable<TD> Select (IEnumerable<TS> e, SelectFunc f) foreach (TS i in e) yield return f(i); C#3.0 と Linq の関係 public static IEnumerable<TS> Where (IEnumerable<TS> e, Predicate<TS> p) foreach (TS i in e) if (p(i)) yield return i;

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 + ")");

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 + ")");

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;

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 + ")");

C#3.0 と Linq の関係 オブジェクト初期化子およびコレクション初期化子 var al = new List<MyAccount> new MyAccountName="hnaka",ZipCode="553-0001",Prefecture=" 大阪府 ", new MyAccountName="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 + ")");

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 + ")");

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 + ")");

パーシャルメソッド 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( 郵便番号エラー );

結論 C#3.0 と Linq の関係 言語拡張はLinqのためだった 便利に短く書けるようになった from から先に書く 型推論が働くので入力が簡単 SQL 文とは順序が逆なので注意

Entity Data Model Linq は O/R マッピングか? O/R マッピングはこんな感じ じゃぁそうじゃん データベース オブジェクト

Entity Data Model Linq to Entities はこんな感じ 物理データモデル論理データモデル概念データモデル概念データクエリ

CSDL MSL SSDL Entity Data Model Linq to Entities の構造 概念 マッ ピン グ 論理 ストア

Entity Data Model 概念モデルは 概念スキーマ定義言語 (CSDL: Conceptual Schema Definition Language) を使用して XML ファイルに定義 データベーススキーマを表す論理モデルは ストアスキーマ定義言語 (SSDL: Store Schema Definition Language) を使って XML ファイルに定義 マッピング層は マッピングスキーマ言語 (MSL : Mapping Schema Language) を使用して定義

Entity Data Model 業務データモデル開発の流れ 業務を分析して概念モデルを作る データの内容 データの分類と命名 データの操作 実際のデータベースに合わせ論理モデルを作る エンティティ ( 項目 ) ドメイン ( データ型 ) キー スーパータイプ サブタイプ

Entity Data Model 業務データモデル開発の流れ 実際のデータベースに適用する プライマリーキー リレーション 基本の型に合わせる インデックス トリガ 容量試算や配置の考慮

Entity Data Model ソフトウェアエンジニアはデータベースに対してプログラムを作ってきた これからはデータベースに向き合ってプログラムを作る時代ではなくなった 業務概念そのものに向き合ってプログラムを作る時代になっていく

Entity Data Model Entity Framework の新技術たち C# VB その他の言語 LINQ to Entities Astoria Jasper ADO.NET Entity Client Entity Client Entity Client Entity Framework (edmx ファイル ) CSDL MDL SSDL Data Base

結論 Entity Data Model 業務概念そのものを相手にした設計が必要 概念レベル設計をしないデータベース設計がまかり通っているが概念レベル設計したほうがいい 概念レベル設計をきちんとやっておくとプログラムも作りやすくなる 新しい技術も生み出されてきている

まとめ Microsoft はプラットフォームベンダーとしてデータの扱い方について試行錯誤しながら今日まで来た Linq を通じてデータの扱い方を統一することにした Linq to SQL を使って O/R マッピングについて考えた Linq to Entities でその上位概念からとらえることにした

参考になるページ おつかれさまでした 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.eventregistration.jp/events/te07/special_session.htm