Upload
shinichiaoyagi
View
2.392
Download
4
Embed Size (px)
DESCRIPTION
第3回 LINQ勉強会のセッション資料です。
Citation preview
青柳 臣一 @ShinichiAoyagi
LINQ 概要+
結構便利な LINQ to XML
第3回 LINQ 勉強会2013/12/14(土)
• 青柳 臣一(あおやぎ しんいち)@ShinichiAoyagihttp://shinichiaoyagi.blogspot.jp/
• 職業 ソフトウエア開発 C# 、 VB 、 WPF 、 Windows Forms C 、 C++ HTML5 、 JavaScript PHP 、 MySQL Windows 、 Linux 、 iOS 、 Android
自己紹介
• Language-Integrated Query
• クエリー機能を言語に統合
• クエリーは SQL とかのクエリー 「問い合わせ」
• Visual Studio 2008 ( .NET Framework 3.0 )で搭載
LINQ (1)
• コレクションの検索– 配列や List<T> など
LINQ to Objects
• データベースの検索– DataContext
LINQ to SQL
LINQ (2)
• 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
• let 、 join 、 group 、 orderby など一通りのことはできる– 標準クエリ演算子の概要http://
msdn.microsoft.com/ja-jp/library/vstudio/bb397896.aspx
– VB には Aggregate があるが C# には無い( C# では書けない)
クエリー式 (2)
• 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)
• すべてクエリー式を使わない形に変換可能
クエリー式はシンタックスシュガー
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)
• VS 2008 のときの追加機能は LINQ のため• 暗黙的な型指定( var 、 Dim )• 拡張メソッド• ラムダ式• 匿名クラス• オブジェクト初期化子、コレクション
初期化子
LINQ のための言語サポート (1)
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
コレクション初期化子
オブジェクト初期化子
拡張メソッド
ラムダ式
匿名クラス
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
コレクション初期化子
オブジェクト初期化子
拡張メソッド
ラムダ式
匿名クラス
• 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);
• 最終的には for や foreach と同等
LINQ to Objects (2)
• 見た目は 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);
• テーブルとかは 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);
• コンパイル時にすること– ラムダ式を Expression 型に変換するコー
ドを作り出す
• 実行時(列挙したとき)にすること– Expression 型を元に SQL 文を作ったりし
て実行
LINQ to SQL (3)
• もう一つの XML API– W3C の XmlDocument とかとは別
• XDocument 、 XElement 、 XAttribute– System.Xml.Linq 名前空間
LINQ to XML (1)
• コンストラクタが便利
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))
));
• 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");
• 明示的な型変換が便利
• 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);
• XPath も使える– System.Xml.XPath 名前空間
• 注意– 明示的な型変換に失敗すると例外
XDocument 属の便利なところ (4)
var n =xml.XPathSelectElements("/AddressBook/
Person").Max(x => (int?)x.Element("Age") ?? -1);
• 非同期やイベントドリブンなものを LINQ っぽく扱えるようにするもの
– GPS の位置情報がやってくるのを処理するとか
– Leap Motion からやってくるデータを処理するとか
Reactive Extensions (Rx)