33. オブジェクト イニシャライザ
• インスタンス化とプロパティ設定を一行で
// 1.0~2.0
// プロパティをひとつずつ設定
Point point = new Point();
point.X = 1;
point.Y = 2;
// またはコンストラクタを作成して
Point point = new Point(1, 2);
// 3.0
var point = new Point { X = 1, Y = 2 };
34. コレクション イニシャライザ
• ICollection<T> を配列感覚で初期化
// 1.0~2.0
List<Point> list = new List<Point>();
list.Add(new Point(10, 20));
list.Add(new Point( 0, 0));
list.Add(new Point(30, 10));
// 3.0
var list = new List<Point> {
new Point { X = 10, Y = 20 },
new Point { X = 0, Y = 0 },
new Point { X = 30, Y = 10 },
};
41. Linq とは
• データの集合から簡単な記述で『必要なオブ
ジェクト』の『必要なメンバ』のみを『必要と
する順序』で取り出せるようにしたシンタック
スシュガー
– 開発者は抽出条件、抽出するメンバ、抽出順序に
のみ関心を払う
– 取り出すデータの型不要
– 繰り返し文不要
var query = from データ変数 in データの集合
where 抽出条件
orderby 抽出順序のキー項目
select 抽出するメンバ で構成される新しいクラス;
42. Linq の種類
C# VB その他の言語
.NET LINQ
LINQ to LINQ to LINQ to
LINQ to SQL LINQ to XML
Objects Datasets Entities
Object XML
Data Base
43. データベース関連のLinq
.NET LINQ
• データベース周りのLinq LINQ to
LINQ to
LINQ to SQL
DataSets Entities
ADO.NET
Dataset Entity Client
Data Context
Table Entity
Adapter Framework
Data Base
44. Linq to Object
•IEnumerable<T> なオブジェクトをクエリ
var bookList = new[] {
new { タイトル = "C#入門" , ISBNコード = "AAAAAAA", 価格 = 2980 },
new { タイトル = "VB入門" , ISBNコード = "BBBBBBB", 価格 = 3300 },
new { タイトル = ".NET Framework", ISBNコード = "CCCCCCC", 価格 = 7800 }
};
var books = from aBook in bookList
where aBook.ISBNコード == "BBBBBBB"
select new { タイトル = aBook.タイトル, 価格 = aBook.価格 };
books.ForEach(item => Console.WriteLine(item));
45. Linq to DataSet
•DataSet をクエリ
var ds = new DataSet();
testTableAdapter.Fill(ds);
var accounts = from aBook in ds.Book
where aBook.ISBNコード == "BBBBBBB"
select new { タイトル = aBook.タイト
ル,
価格 = aBook.
価格 };
books.ForEach(item => Console.WriteLine(item));
46. Linq to SQL
•SQL Server のデータベースをクエリ
using (var db = new DataClasses1DataContext()) {
var accounts = from aBook in db.Book
where aBook.ISBNコード == "BBBBBBB"
select new { タイトル = aBook.タイトル,
価格 = aBook.価格 };
books.ForEach(item => Console.WriteLine(item));
}
49. Linq to Entities
• Entity Framework による概念エ
ンティティをクエリ
var accounts = from aBook in textContext.Book
where aBook.ISBNコード == "BBBBBBB"
select new { タイトル = aBook.タイトル,
価格 = aBook.価格 };
books.ForEach(item => Console.WriteLine(item));
50. Linq to XML
• XML の Xelement をクエリ
– RSS の読み込みなどに便利
var xElement = XElement.Load("../../Books.xml");
var books = from aBook in xElement.Elements()
where aBook.Element("ISBNコード").Value == "BBBBBBB"
select new
{
タイトル = aBook.Attribute("タイトル").Value,
価格 = int.Parse(aBook.Element("価格").Value)
};
books.ForEach(item => Console.WriteLine(item));
57. クエリ式
• From 句からはじまる
• from、let、where、join、orderby
を内部に記述
• Select 句または group 句で終わる
• add/update/deleteは仕様として存
在しない
– データを抽出することが目的
58. クエリ式
• where (抽出条件)
– where book.タイトル.Contains(“.NET”)
– where book.価格 < 2000
• orderby (抽出順序)
– orderby book.タイトル
– orderby book.価格 descending
– orderby book.タイトル, book.価格
59. LINQの仕組み
• クエリ式はラムダ式を引数にとる拡張メソッドが
連結された形式に変換される
var query = from book in bookse
where book.タイトル.Contans(“C#”)
orderby book.タイトル
select new { book.タイトル, book.価格 };
var query = books.Where(book => book.タイトル.Contans(“C#”))
.OrderBy(book => book.タイトル)
.Select(book => new {book.タイトル,
book.価格});
61. LINQの仕組み
• 遅延実行
– データが実際に必要となるタイミングまでクエ
リ条件が積み重ねられる
• LINQ to SQL では最終的にデータを参照するタイミン
グ (DataBind 時など) にSQL文が生成される
var query1 = from book in db.書籍
orderby book.タイトル
select new { 出版社名 = book.出版社.名前, 書籍タイトル = book.タイトル };
var query2 = from book in query1
where book.出版社名.Contains("C")
select book;
query2.ToList().ForEach(book => Console.WriteLine(book));
SELECT [t1].[名前] AS [出版社名], [t0].[タイトル] AS [書籍タイトル]
FROM [dbo].[書籍] AS [t0]
LEFT OUTER JOIN [dbo].[出版社] AS [t1] ON [t1].[ID] = [t0].[出版社ID]
WHERE [t1].[名前] LIKE @p0
ORDER BY [t0].[タイトル]