linq 概要 + 結構便利な linq to xml

22
青青 青@ShinichiAoyagi LINQ 青青 + 青青青青青 LINQ to XML 青3青 LINQ 青青青 2013/12/14 土土 ()

Upload: shinichiaoyagi

Post on 28-May-2015

2.376 views

Category:

Technology


4 download

DESCRIPTION

第3回 LINQ勉強会のセッション資料です。

TRANSCRIPT

Page 1: LINQ 概要 + 結構便利な LINQ to XML

青柳 臣一  @ShinichiAoyagi

LINQ 概要+

結構便利な LINQ to XML

第3回 LINQ 勉強会2013/12/14(土)

Page 2: LINQ 概要 + 結構便利な LINQ to XML

• 青柳 臣一(あおやぎ しんいち)@ShinichiAoyagihttp://shinichiaoyagi.blogspot.jp/

• 職業 ソフトウエア開発    C# 、 VB 、 WPF 、 Windows Forms    C 、 C++    HTML5 、 JavaScript    PHP 、 MySQL    Windows 、 Linux 、 iOS 、 Android

自己紹介

Page 3: LINQ 概要 + 結構便利な LINQ to XML

• Language-Integrated Query

• クエリー機能を言語に統合

• クエリーは SQL とかのクエリー  「問い合わせ」

• Visual Studio 2008 ( .NET Framework 3.0 )で搭載

LINQ (1)

Page 4: LINQ 概要 + 結構便利な LINQ to XML

• コレクションの検索– 配列や List<T> など

LINQ to Objects

• データベースの検索– DataContext

LINQ to SQL

LINQ (2)

Page 5: LINQ 概要 + 結構便利な LINQ to XML

• C# や VB で SQL みたいな書き方ができる

クエリー式 (1)

var array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };var q = from x in array

where x % 2 == 0select x;

Dim array() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}Dim q = From x In array

Where x Mod 2 = 0Select x

Page 6: LINQ 概要 + 結構便利な LINQ to XML

• let 、 join 、 group 、 orderby など一通りのことはできる– 標準クエリ演算子の概要http://

msdn.microsoft.com/ja-jp/library/vstudio/bb397896.aspx

– VB には Aggregate があるが C# には無い( C# では書けない)

クエリー式 (2)

Page 7: LINQ 概要 + 結構便利な LINQ to XML

• VB の Skip 、 Take

• VB の Aggregate

クエリー式 (3)

Dim q = From x In arraySkip 3Take 2Select x

Dim total = Aggregate x In arrayWhere x Mod 2 = 0Into Sum(x)

Page 8: LINQ 概要 + 結構便利な LINQ to XML

• すべてクエリー式を使わない形に変換可能

クエリー式はシンタックスシュガー

var q = array.Where(x => x % 2 == 0).Select(x => x);

Dim q = array.Where(Function(x) x Mod 2 = 0).Select(Function(x) x)

Page 9: LINQ 概要 + 結構便利な LINQ to XML

• VS 2008 のときの追加機能は LINQ のため• 暗黙的な型指定( var 、 Dim )• 拡張メソッド• ラムダ式• 匿名クラス• オブジェクト初期化子、コレクション

初期化子

LINQ のための言語サポート (1)

Page 10: LINQ 概要 + 結構便利な LINQ to XML

LINQ のための言語サポート (2)

var people = new[]{

new Person() { Name = “太郎 ", Age = 14, },

new Person() { Name = “花子 ", Age = 17, },};var q = people

.Where(x => x.Age <= 15)

.Select(x => new { x.Name });

var

コレクション初期化子

オブジェクト初期化子

拡張メソッド

ラムダ式

匿名クラス

Page 11: LINQ 概要 + 結構便利な LINQ to XML

LINQ のための言語サポート (3)

Dim people() ={

New Person() With {.Name = “太郎 ", .Age = 15},

New Person() With {.Name = “花子 ", .Age = 14}}Dim q = people.

Where(Function(x) x.Age <= 15).Select(Function(x) New With {x.Name})

var

コレクション初期化子

オブジェクト初期化子

拡張メソッド

ラムダ式

匿名クラス

Page 12: LINQ 概要 + 結構便利な LINQ to XML

• IEnumerable– 配列やコレクションは IEnumerable を実

装している

• だから– System.Linq.Enumerable

LINQ to Objects (1)

public static IEnumerable<TSource> Where<TSource>(

this IEnumerable<TSource> source,Func<TSource, bool> predicate);

public static IEnumerable<TSource> Where<TSource>(

this IEnumerable<TSource> source,Func<TSource, int, bool> predicate);

Page 13: LINQ 概要 + 結構便利な LINQ to XML

• 最終的には for や foreach と同等

LINQ to Objects (2)

Page 14: LINQ 概要 + 結構便利な LINQ to XML

• 見た目は LINQ to Objects とほぼ同じ

LINQ to SQL (1)

var db = new NorthwindDataContext();var q = from c in db.Customers

where c.Country == “USA”select c.ContactName;

var db = new NorthwindDataContext();var q = db.Customers

.Where(c => c.Country == “USA”)

.Select(c => c.ContactName);

Page 15: LINQ 概要 + 結構便利な LINQ to XML

• テーブルとかは IQueryable

• だから– System.Linq.Queryable

LINQ to SQL (2)

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source,Expression<Func<TSource, bool>> predicate);

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source,Expression<Func<TSource, int, bool>>

predicate);

Page 16: LINQ 概要 + 結構便利な LINQ to XML

• コンパイル時にすること– ラムダ式を Expression 型に変換するコー

ドを作り出す

• 実行時(列挙したとき)にすること– Expression 型を元に SQL 文を作ったりし

て実行

LINQ to SQL (3)

Page 17: LINQ 概要 + 結構便利な LINQ to XML

• もう一つの XML API– W3C の XmlDocument とかとは別

• XDocument 、 XElement 、 XAttribute– System.Xml.Linq 名前空間

LINQ to XML (1)

Page 18: LINQ 概要 + 結構便利な LINQ to XML

• コンストラクタが便利

XDocument 属の便利なところ (1)

var xml = new XDocument(new XElement("AddressBook",

new XElement("Person", new XAttribute("Id", 100),

new XElement("Name", "太郎 "),new XElement("Age", 20)),

new XElement("Person", new XAttribute("Id", 101),

new XElement("Name", "花子 "),new XElement("Age", 25))

));

Page 19: LINQ 概要 + 結構便利な LINQ to XML

• LINQ で使えるのが便利

XDocument 属の便利なところ (2)

var q = from x in xml.Elements("AddressBook").Elements("Person")

where x.Attribute("Id").Value == "100"select x;

var q = xml.Elements("AddressBook").Elements("Person")

.Where(x => x.Attribute("Id").Value == "100");

Page 20: LINQ 概要 + 結構便利な LINQ to XML

• 明示的な型変換が便利

• Nullable への明示的な型変換が便利

XDocument 属の便利なところ (3)

var n = xml.Elements("AddressBook").Elements("Person")

.Max(x => (int)x.Element("Age"));

var n = xml.Elements("AddressBook").Elements("Person")

.Max(x => (int?)x.Element("Age") ?? -1);

Page 21: LINQ 概要 + 結構便利な LINQ to XML

• XPath も使える– System.Xml.XPath 名前空間

• 注意– 明示的な型変換に失敗すると例外

XDocument 属の便利なところ (4)

var n =xml.XPathSelectElements("/AddressBook/

Person").Max(x => (int?)x.Element("Age") ?? -1);

Page 22: LINQ 概要 + 結構便利な LINQ to XML

• 非同期やイベントドリブンなものを LINQ っぽく扱えるようにするもの

– GPS の位置情報がやってくるのを処理するとか

– Leap Motion からやってくるデータを処理するとか

Reactive Extensions (Rx)