Linq Linq C VB NET LINQ to Objects
Linq概要 • Linqの種類 C# VB その他の言語 . NET LINQ to Objects Object LINQ to Datasets LINQ to SQL LINQ to Entities LINQ to XML Data Base わんくま同盟 大阪勉強会 #14
Linq概要 • データベース周りのLinq. NET LINQ to Datasets Dataset Table Adapter LINQ to SQL ADO. NET Data Context LINQ to Entities Entity Client Entity Framework Data Base わんくま同盟 大阪勉強会 #14
Linq概要 • Linq to Objects IEnumerable<T> ベースのすべての情報 ソースにクエリを適用 var al = new [] { new {Name="hnaka", Zip. Code="553 -0001", Prefecture="大阪府"}, new {Name="hkodama", Zip. Code="168 -0064", Prefecture="東京都"} }; var accounts = from a in al where a. Zip. Code == "168 -0064" select new { a. Name, a. Zip. Code }; foreach (var account in accounts) { Console. Write. Line(account. Name+ "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
Linq概要 • Linq to Data. Set 従来のADO. NETのData. Setのすべての情報 ソースにクエリを適用 Data. Set al = new Data. Set(); test. Table. Adapter. Fill(al); var accounts = from a in al. Account where a. Zip. Code == "168 -0064" select new { Name = a. Name, Zip. Code = a. Zip. Code }; foreach (var account in accounts) { Console. Write. Line(account. Name+ "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
Linq概要 • Linq to SQLサーバーのデータベースのすべての情 報ソースにクエリを適用 using (Data. Classes 1 Data. Context db = new Data. Classes 1 Data. Context (Linq 1. Properties. Settings. Default. TESTConnection. String)) { var accounts = from a in db. Account where a. Zip. Code == "168 -0064" select a; foreach (Account account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } } わんくま同盟 大阪勉強会 #14
Linq概要 • Linq to Entities Entity Framework を通した概念エンティティ の情報ソースにクエリを適用 var accounts = from a in text. Context. Account where a. Zip. Code == "168 -0064" select a; foreach (Account account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
Linq概要 • Linq to XMLのXElementのすべての情報ソースにク エリを適用 var al = new XElement(“Account”, new XAttribute(“Can. Code”, true), new XElement(“Name”, “ hkodama”), new XElement(“Zip. Code”, “ 168 -0064”), new XElement(“Prefecture”, “東京都”)); var accounts = from a in al where a. Zip. Code == "168 -0064" select new Account { Name = a. Attribute(“Name”), Zip. Code = a. Attribute("Zip. Code") }; foreach (var account in accounts) { Console. Write. Line(account. Name+ "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
Linq概要 • まとめ – 一般に. Net. Frameworkでデータとして扱うすべて が対象 名称 対象 Linq to Objects IEnumerable<T> Linq to Data. Set ADO. NETのData. Set Linq to SQLサーバーのデータベース Linq to Entities Entity Framework を通した概念エンティティ Linq to XMLのXElement わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • C#2. 0で書いてみた List<My. Account> al = new List<My. Account>(); al. Add(new My. Account("hnaka", "553 -0001", "大阪府")); al. Add(new My. Account("hkodama", "168 -0064", "東京都")); IEnumerable<My. Account 2> accounts = Enumerable. Extensions<My. Account, My. Account 2>. Select( Enumerable. Extensions<My. Account, My. Account 2>. Where (al, delegate(My. Account a) { return a. Zip. Code == "168 -0064"; }), delegate(My. Account a) { return new My. Account 2(a. Name, a. Zip. Code); } ); Console. Write. Line("C#2. 0"); foreach (My. Account 2 account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 public class My. Account { public My. Account() { _name = ""; _zipcode = ""; _prefecture = ""; } public My. Account(string name, string zipcode, string prefecture) { _name = name; _zipcode = zipcode; _prefecture = prefecture; } private string _name; set { _name = value; } } private string _zipcode; public string Zip. Code { get { return _zipcode; } set { _zipcode = value; } } private string _prefecture; public string Prefecture { get { return _prefecture; } set { _prefecture = value; } } } public string Name { get { return _name; } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 public class My. Account 2 { public My. Account 2() { _name = ""; _zipcode = ""; } public My. Account 2(string name, string zipcode) { _name = name; _zipcode = zipcode; } private string _name; public string Name { get { return _name; } set { _name = value; } } private string _zipcode; public string Zip. Code { get { return _zipcode; } set { _zipcode = value; } } } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 static class Enumerable. Extensions <TS, TD> { public delegate TD Select. Func(TS t); public static IEnumerable<TD> Select (IEnumerable<TS> e, Select. Func f) { foreach (TS i in e) { yield return f(i); } } public static IEnumerable<TS> Where (IEnumerable<TS> e, Predicate<TS> p) { foreach (TS i in e) { if (p(i)) yield return i; } } } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • 暗黙に型付けされたローカル変数 var al = new List<My. Account>(); al. Add(new My. Account("hnaka", "553 -0001", "大阪府")); al. Add(new My. Account("hkodama", "168 -0064", "東京都")); var accounts = Enumerable. Extensions<My. Account, My. Account 2>. Select( Enumerable. Extensions<My. Account, My. Account 2>. Where (al, delegate(My. Account a) { return a. Zip. Code == "168 -0064"; }), delegate(My. Account a) { return new My. Account 2(a. Name, a. Zip. Code); } ); Console. Write. Line("C#3. 0 暗黙に型付けされたローカル変数"); foreach (var account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • 拡張メソッド var al = new List<My. Account>(); al. Add(new My. Account("hnaka", "553 -0001", "大阪府")); al. Add(new My. Account("hkodama", "168 -0064", "東京都")); var accounts = al. Where(delegate(My. Account a) { return a. Zip. Code == "168 -0064"; }). Select(delegate(My. Account a) { return new My. Account 2(a. Name, a. Zip. Code); }); Console. Write. Line("C#3. 0 拡張メソッド"); foreach (var account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 static class Enumerable. Extension { public delegate TD Select. Func<TS, TD>(TS t); public static IEnumerable<TD> Select<TS, TD> (this IEnumerable<TS> e, Select. Func<TS, TD> f) { foreach (TS i in e) { yield return f(i); } } public static IEnumerable<TS> Where<TS> (this IEnumerable<TS> e, Predicate<TS> p) { foreach (TS i in e) { if (p(i)) yield return i; } } } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • ラムダ式 var al = new List<My. Account>(); al. Add(new My. Account("hnaka", "553 -0001", "大阪府")); al. Add(new My. Account("hkodama", "168 -0064", "東京都")); var accounts = al. Where(a => a. Zip. Code == "168 -0064"). Select(a => new My. Account 2(a. Name, a. Zip. Code)); Console. Write. Line("C#3. 0 ラムダ式"); foreach (var account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • オブジェクト初期化子および コレクション初期化子 var al = new List<My. Account> { new My. Account{Name="hnaka", Zip. Code="553 -0001", Prefecture="大阪府"}, new My. Account{Name="hkodama", Zip. Code="168 -0064", Prefecture="東京都"} }; var accounts = al. Where(a => a. Zip. Code == "168 -0064"). Select(a => new My. Account 2 { Name = a. Name, Zip. Code = a. Zip. Code }); Console. Write. Line("C#3. 0 オブジェクト初期化子および コレクション初期化子"); foreach (var account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • 匿名型 var al = new [] { new {Name="hnaka", Zip. Code="553 -0001", Prefecture="大阪府"}, new {Name="hkodama", Zip. Code="168 -0064", Prefecture="東京都"} }; var accounts = al. Where(a => a. Zip. Code == "168 -0064"). Select(a => new { Name = a. Name, Zip. Code = a. Zip. Code }); Console. Write. Line("C#3. 0 匿名型"); foreach (var account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • クエリ式 var al = new[] { new {Name="hnaka", Zip. Code="553 -0001", Prefecture="大阪府"}, new {Name="hkodama", Zip. Code="168 -0064", Prefecture="東京都"} }; var accounts = from a in al where a. Zip. Code == "168 -0064" select new { Name = a. Name, Zip. Code = a. Zip. Code }; Console. Write. Line("C#3. 0 クエリ式"); foreach (var account in accounts) { Console. Write. Line(account. Name + "(" + account. Zip. Code + ")"); } わんくま同盟 大阪勉強会 #14
C#3. 0とLinqの関係 • パーシャルメソッド – Linqでカスタムプロパティ検証や挿入・更新・削除 メソッドの検証に使用する public partial class Data. Classes 1 Data. Context { public partial class Account { partial void On. Zip. Code. Changing(string value) { Regex zipcheck = new Regex(@“^[0 -9]{3}-[0 -9]{4}$”); if (!zipcheck. Is. Match(value)) throw new Excepton(“郵便番号エラー”); } } } わんくま同盟 大阪勉強会 #14
Entity Data Model • Entity Framework の新技術たち C# LINQ to Entities ADO. NET Entity Client Entity Framework (edmxファイル) VB その他の言語 Astoria Jasper Entity Client CSDL Entity Client MDL Data Base わんくま同盟 大阪勉強会 #14 SSDL
おつかれさまでした 参考になるページ http: //blogs. wankuma. com/chicasharp/ http: //msdn. microsoft. com/msdnmag/issues/ 07/06/CSharp 30/default. aspx? loc=jp http: //msdn. microsoft. com/msdnmag/issues/ 07/07/Data. Points/default. aspx? loc=jp http: //www. eventregistration. jp/events/te 07/special_session. htm わんくま同盟 大阪勉強会 #14
- Slides: 37