LINQ 概要 + 結構便利な LINQ to XML

3,204 views
3,085 views

Published on

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

Published in: Technology, News & Politics
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,204
On SlideShare
0
From Embeds
0
Number of Embeds
2,176
Actions
Shares
0
Downloads
5
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

LINQ 概要 + 結構便利な LINQ to XML

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

×