Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

4,124 views

Published on

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

Published in: Technology, News & Politics
  • Be the first to comment

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 からやってくるデータを処理す るとか

×