Linqその効果的な使い方 えムナウ (児玉宏之)

Slides:



Advertisements
Similar presentations
プログラミング Ⅱ 第2回 第1回(プログラミングⅠの復 習) の解説. プログラムの作り方 いきなり完全版を作るのではなく,だんだ んふくらませていきます. TicTa cToe1.
Advertisements

Final LINQ Extensions Center CLR Part.2 – Kouji
第8回まどべんよっかいち Kouji Matsui kekyo.wordpress.com)
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
東京工科大学 コンピュータサイエンス学部 亀田弘之
3-1 MySQLについて 発表者:藤村元彦 自然言語処理研究室.
Linqその効果的な使い方 えムナウ (児玉宏之)
Ex7. Search for Vacuum Problem
2008年12月11日 RDBMSとSQL(2/3) 関数,GROUP,JOIN,演算
Ex8. Search for Vacuum Problem(2)
6-2 データベース 1.SQLite SQLを単純化した SQLite を使ってデータベースを操作 表「fruit」
C# 3.0をはじめよう!!.
技術トピックス 2015/03.
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
ACCESSによる データベースアプリケーション開発実習 日本工業大学 情報工学科 “データベースの実際” 教材
SQL J2EE I 第3回 /
プログラミング基礎I(再) 山元進.
Linq for VB はものすごい えムナウ (児玉宏之)
Linq for VB はものすごい えムナウ (児玉宏之)
3-2.データを取り出す 2004年 5月20日(木) 01T6074X 茂木啓悟.
アルゴリズムとデータ構造 2011年6月13日
T-SQL の Parse と Generate
C# の現在・過去・未来 えムナウ (児玉宏之)
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
2004/05/13 3-4 データ型(カラムタイプ) について 発表者:藤村元彦 自然言語処理研究室.
SQL パフォーマンス チューニング ~ カバーリングインデックス/クエリヒントの利用~
Oracle XEを使ってみよう 初音玲.
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
3-10. MySQLシステムの管理  2004年6月10日  大北高広                01T6010F.
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
SQL パフォーマンス チューニング ~ プランガイドの利用~
R流・C#マルチスレッドの復讐 2009年05月16日 R・田中一郎
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
第3回.テーブルの結合 結合条件 SQL を用いた結合問い合わせ.
第3回.テーブルの結合 結合条件 SQL を用いた結合問い合わせ.
C# の現在・過去・未来 えムナウ (児玉宏之)
データベースアクセス技術 ADO.NET 2.0 開発者カテゴリ ◆NOTES◆
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
3-6.インデックスについて 3-7.関数と併用されることの 多いMySQLコマンド
3-3.テーブルを更新する 2004年 4月22日(木) 01T6074X 茂木啓悟.
マイクロソフト Access での SQL 演習 第4回 並べ替え(ソート)
Null ヤバイのでなんとかする takeshik.
Null ヤバイのでなんとかする takeshik.
Oracle XEを使ってみよう 初音玲.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
Ex7. Search for Vacuum Problem
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
3-8・関数を使ってデータを取り出す   2004年6月3日(木) 01T6010F               大北高広.
3.リレーショナルデータベース,主キー, SQL
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
EntityManager と EJB QL EJB 3.0 コース 第8回 2006年8月5日.
アルゴリズムとデータ構造 2012年6月11日
「マイグレーションを支援する分散集合オブジェクト」
サブゼミ第7回 実装編① オブジェクト型とキャスト.
再帰CTE を使って遊ぼう 大阪#9 2012/04/14.
アルゴリズムとデータ構造1 2009年6月15日
TableAdapterとSQLDependency 便利さを使い倒そう。 by えムナウ
CO-Client Opeartion 1.1 利用履歴データベースの設計 (スキーマ バージョン 対応)
09 06/23 PHP と SQL (MySQL) の連携 その3
How To WPF アプリケーション Part4 By 中博俊.
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
SQL J2EE I (データベース論) 第3回 /
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
SQL データベース論 第11回.
How To WPF アプリケーション Part3 By 中博俊.
Presentation transcript:

Linqその効果的な使い方 えムナウ (児玉宏之) http://mnow.jp/ http://mnow.wankuma.com/ えムナウ (児玉宏之) http://mnow.jp/ http://mnow.wankuma.com/ http://blogs.wankuma.com/mnow/ http://www.ailight.jp/blog/mnow/

はじめに Linq to Object をながめてみる Linq to Object の正体 Linq to SQL の使いどころ まとめ アジェンダ はじめに Linq to Object をながめてみる Linq to Object の正体 Linq to SQL の使いどころ まとめ

Linq のセッションや勉強会、Webでの情報も結構出てきていて、そろそろ飽きてきている方もいると思います。 はじめに Linq のセッションや勉強会、Webでの情報も結構出てきていて、そろそろ飽きてきている方もいると思います。 そろそろ仕事でも使ってみようとしている方も多いと思います。 そこで今日はLinq to Object ・ Linq to SQL の全体像と使うときの注意点を見ていきたいと思います。

Linq はあらかじめ データベースのSQL文のようなクエリ式の構文が用意されています。 Linq to Object をながめてみる Linq はあらかじめ データベースのSQL文のようなクエリ式の構文が用意されています。 C# は、メソッドベースでしかサポートされていない機能もありますが、Visual Basic ではクエリ式の構文が用意されています。 いっぱいあるので組み合わせて使うととても便利です。

Linq to Object をながめてみる IEnumerableメソッド C# のクエリ式の構文 Visual Basic のクエリ式の構文 Cast from type i in numbers From … As … GroupBy group … by Group … By … Into … group … by … into … GroupJoin join … in … on … equals … into … Group Join … In … On … Join join … in … on … equals … From x In , y In Where x.a = y.a Join … [As …]In … On … let … = … Let … = … OrderBy orderby … Order By … OrderByDescending orderby … descending Order By … Descending Select select SelectMany 複数の from 句。 複数の From 句。 ThenBy orderby …, … Order By …, … ThenByDescending orderby …, … descending Order By …, … Descending Where where

Linq to Object をながめてみる IEnumerableメソッド C# のクエリ式の構文 Visual Basic のクエリ式の構文 All 該当なし Aggregate … In … Into All(…) Any Aggregate … In … Into Any() Average Aggregate … In … Into Average() Count Aggregate … In … Into Count() Distinct LongCount Aggregate … In … Into LongCount() Max Aggregate … In … Into Max() Min Aggregate … In … Into Min() Skip SkipWhile Skip While Sum Aggregate … In … Into Sum() Take TakeWhile Take While

ちょっと待って Visual Basic に乗り換えちゃおうか C# って言語のサポートが少ない 不便だよねぇ Linq to Object をながめてみる C# って言語のサポートが少ない 不便だよねぇ どうせだったらフルサポートすればいいのに Visual Basic っていいなぁ Visual Basic に乗り換えちゃおうか ちょっと待って

そんなに困らない Linq to Object をながめてみる var earlyBirdQuery = from sentence in strings let words = sentence.Split(' ', '.') from word in words where !string.IsNullOrEmpty(word) let w = word.ToLower() orderby w select w;   foreach (var v in earlyBirdQuery.Distinct()) Console.WriteLine(v); string[] strings = { "A penny saved is a penny earned.", "The early bird catches the worm.", "The pen is mightier than the sword.", "My name is M-now." }; そんなに困らない

困らないよ~~ Linq to Object をながめてみる double[] value = {1.2, 3.6, 2.1, 10.5, 4.8, 6.3}; var calcQuery = from v in value orderby v select v; var cutQuery = calcQuery.Skip(1).Take(calcQuery.Count() - 2); Console.WriteLine("Count=" + cutQuery.Count()); Console.WriteLine("Sum=" + cutQuery.Sum()); Console.WriteLine("Average=" + cutQuery.Average()); Console.WriteLine("Max=" + cutQuery.Max()); Console.WriteLine("Mix=" + cutQuery.Min()); 困らないよ~~

Linq to Object をながめてみる Enumerableメソッド 機能 Concat 2つのIEnumerableの連結 Contains 要素がIEnumerableに格納されているかどうかを判断 Except 1つめのIEnumerableから2つめのIEnumerableの要素を削除 Intersect 2つのIEnumerableの積集合 OfType<Type> Typeで指定された型の物だけ抜き出す Range 指定範囲の整数のIEnumerableを作成 Repeat 一つの要素を繰り返し作成 Reverse IEnumerableの要素の順番を反転 SequenceEqual 2つのIEnumerableが等しいか比較 Union 2つのIEnumerableの和集合

Linq to Object をながめてみる Enumerableメソッド 機能 DefaultIfEmpty IEnumerableが空でなければそのまま、空ならデフォルト値 ElementAt インデックス位置にある要素 ElementAtOrDefault インデックス位置にある要素、空ならデフォルト値 Empty 空のIEnumerable First 先頭の要素 FirstOrDefault 先頭の要素、空ならデフォルト値 Last 最後の要素 LastOrDefault 最後の要素、空ならデフォルト値 Single 要素が一つか確認し取り出す SingleOrDefault 要素が一つか確認し取り出す、空ならデフォルト値 ToArray Arrayに変換する ToDictionary Dictionaryに変換する ToList Listに変換する ToLookup Lookupに変換する

デフォルト値って? 数値の場合は0です。 bool は false です。 参照型は null です。 Linq to Object をながめてみる デフォルト値って? 数値の場合は0です。 bool は false です。 参照型は null です。

For ループの置き換え でも foreach でダンプしちゃつまんないけどね Linq to Object をながめてみる delegate T Y<T>(Y<T> y); Y<Func<Func<Func<int, int>, Func<int, int>>, Func<int, int>>> Y = y => f => x => f(y(y)(f))(x); Func<Func<int, int>, Func<int, int>> g = f => x => x == 0 ? 1 : x * f(x - 1); var fact = from i in Enumerable.Range(1, 10) select Y(Y)(g)(i); foreach (var i in fact) Console.WriteLine(i);

まとめ データベースのSQL文のようなクエリ式の構文が用意 Linq to Object をながめてみる まとめ データベースのSQL文のようなクエリ式の構文が用意 Visual Basic は、言語サポートがしっかりしている、C# はそんなに困らない程度のサポート 色々と組み合わせて使うととても便利

どちらが簡単で分かりやすくてなおかつ速いのでしょうか? Linq to Object の正体 どちらが簡単で分かりやすくてなおかつ速いのでしょうか? A) var accounts = from a in al where a.ZipCode == "168-0064" select new { Name = a.Name, ZipCode = a.ZipCode };  foreach (var account in accounts) Console.WriteLine(account.Name + "(" + account.ZipCode + ")"); B)  foreach (var a in al) if (a.ZipCode == "168-0064") Console.WriteLine(a.Name + "(" + a.ZipCode + ")");

どちらが速いでしょうか? Linq to Object の正体 B) static int[] cal2(int[] arr) { int sum = 0; int count = 0; int max = int.MinValue; int min = int.MaxValue; foreach (int a in arr) sum += a; count++; if (max < a) max = a; if (min > a) min = a; } return new int[] { sum, count, max, min }; B) static int[] cal2(int[] arr) { return new int[] { arr.Sum(), arr.Count(), arr.Max(), arr.Min() }; }

Linq to Object は、 IEnumerable<T> によるパイプラインという見方もできます。 IEnumerable<T> ですから、 Linq to Object のメソッドは、一般に foreach を内部で使っていますので、あまり高速性能を発揮できません。

例えば右のメソッドは foreach 何回ループするでしょうか? Sum、Count、Max、Minが別々のパイプラインです。 Linq to Object の正体 例えば右のメソッドは foreach 何回ループするでしょうか? Sum、Count、Max、Minが別々のパイプラインです。 4回の foreach を内部で  行なうことになります。 static int[] cal2(int[] arr) { return new int[] { arr.Sum(), arr.Count(), arr.Max(), arr.Min() }; }

同じ Linq の foreach を何回もやるんであれば ToArray しておくのがお勧め Linq to Object をながめてみる 同じ Linq の foreach を何回もやるんであれば ToArray しておくのがお勧め 10000 x 1000 ループで、 当社比なんと52倍

まとめ Linq to Object は、 IEnumerable<T> によるパイプライン 便利に使うことができる反面、メソッドの内部で使用する foreach の回数に注意を払わないと、効率が悪い場合もある 同じ Linq の foreach を何回もやるんであれば ToArray

すくなくとも今のところ大規模案件で使う気はないです。 Linq to SQL の使いどころ <N氏談>  すくなくとも今のところ大規模案件で使う気はないです。  大規模案件で使う気はないです。  使う気はないです 使う気はない

Linq は Query ですが Linq to SQL の母体になる DataContext は Dataset より進化しています。 Row は INotifyPropertyChanging や INotifyPropertyChanged を実装したObjectです。 当然 Insert Update Delete ストアド も使えます。 あらかじめ必要な partial method が仕込まれています。 同時実行制御で競合の解決がサポートされています。

Linq to SQL の使いどころ データの一部を表示する場合 コンボボックスに表示するだけなのに、Dataset DataTable DataRow みたいにフルセットのインスタンスなんか必要なの? コンボボックスに表示するだけなのに、一々ストアド作んなきゃいけないの? Linq to SQL なら 匿名型を使って軽いコンボボックス用のインスタンスを作れる Linq to SQL なら ストアドに対応することもできる

たったこれだけのソースで、WPFのコンボボックスの選択可能なデータがセットできます。 Linq to SQL の使いどころ たったこれだけのソースで、WPFのコンボボックスの選択可能なデータがセットできます。 using (NWDataContext context = new NWDataContext()) { var customerComboBoxQuery = from customer in context.Customers select new { ID = customer.CustomerID, Name = customer.CompanyName }; this.comboBox1.ItemsSource = customerComboBoxQuery; this.comboBox1.SelectedValuePath = "ID"; this.comboBox1.DisplayMemberPath = "Name"; }

同時実行制御がすごいことになっています Timestamp 列のあるなしで自動的に最適な楽観的同時実行制御のコードを作ってくれます。 Linq to SQL の使いどころ 同時実行制御がすごいことになっています Timestamp 列のあるなしで自動的に最適な楽観的同時実行制御のコードを作ってくれます。 同時実行制御で競合の解決がサポートされています。

Linq to SQL の使いどころ タイムスタンプと同時実行制御 タイムスタンプがないテーブル WHERE ([ID] = @p0) AND ([TEXT1] = @p1) AND ([TEXT2] = @p2) タイムスタンプがあるテーブル WHERE ([ID] = @p0) AND ([timestamp] = @p1) timestampの読み直しもきちんと行われています。 (Datasetでもちゃんとやってます)

同時実行制御で競合の解決 競合している行単位で競合の解決 Linq to SQL の使いどころ 最新を取得してユーザーには再入力をしてもらうことになります。 conflict.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues) 元の値とユーザーが変更した値で更新が行われ競合を発生させた他者の変更は上書きされます。 conflict.Resolve(Data.Linq.RefreshMode.KeepCurrentValues) 他者の変更とユーザーの変更をマージします。両方が変更した列はユーザーの変更を優先します。 conflict.Resolve(Data.Linq.RefreshMode.KeepChanges)

同時実行制御で競合の解決 競合している行ごとの列単位で競合の解決 Linq to SQL の使いどころ 最新を取得してユーザーには再入力をしてもらうことになります。 member.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues) 元の値とユーザーが変更した値で更新が行われ競合を発生させた他者の変更は上書きされます。 member.Resolve(Data.Linq.RefreshMode.KeepCurrentValues)

Linq to SQL の使いどころ 遅いんじゃないの? 件数によっては  速いです

さらに速くする方法もあります CompiledQuery.Compile Linq to SQL の使いどころ さらに速くする方法もあります CompiledQuery.Compile context.ObjectTrackingEnabled = false; データの変更を追跡しない Query にみの場合に利用できます。 var query = CompiledQuery.Compile(     (LinqTestDataContext db) => from a in db.Table_1 select a     ); 使い方: foreach (var a in query(context))

まとめ DataContext は Dataset より進化しています。 データの一部を表示する場合は楽です。 Linq to SQL の使いどころ まとめ DataContext は Dataset より進化しています。 データの一部を表示する場合は楽です。 同時実行制御で競合の解決もできます。 速くするための方法もあります。 なにより、長年の念願であった「Object」なんです。 Linq to SQL を使って自由を満喫しましょう。

Linq to Object は、 IEnumerable<T> によるパイプライン色々と組み合わせて使うととても便利 まとめ Linq to Object は、 IEnumerable<T> によるパイプライン色々と組み合わせて使うととても便利 Linq to SQLは、 Dataset より進化していて、長年の念願であった「Object」 利点と欠点を理解して上手に使っていきましょう。