LINQソースでGO!
In 名古屋MS系秋祭り 2013/09/21
* Containes too many aminatable elements, so broken look'n feel in slideshare.
http://www.kekyo.net/2013/09/21/%e5%90%8d%e5%8f%a4%e5%b1%8bms%e7%a7%8b%e7%a5%ad%e3%82%8a-linq%e3%82%bd%e3%83%bc%e3%82%b9%e3%81%a7go/
LINQソースでGO!
In 名古屋MS系秋祭り 2013/09/21
* Containes too many aminatable elements, so broken look'n feel in slideshare.
http://www.kekyo.net/2013/09/21/%e5%90%8d%e5%8f%a4%e5%b1%8bms%e7%a7%8b%e7%a5%ad%e3%82%8a-linq%e3%82%bd%e3%83%bc%e3%82%b9%e3%81%a7go/
6. LINQ to Object
• Peopleという名前の配列にName、Genger、
Ageプロパティを持つ匿名オブジェクトを
持つ
var query = from p in People
where p.Gender == 1
orderby p.Age
select new { p.Name, p.Age };
7. LINQ to XML
• PeopleというXElement変数にXMLファイルを読み込む
• XMLファイルはPeople/Personという階層構造を持ち、
PersonノードにはName、Gender、Ageノードが含まれ
る
var query = from p in People.Descendants("Person")
where (int)p.Element("Gender") == 1
orderby (int)p.Element("Age")
select
new {
Name = (string)p.Element("Name"),
Age = (int)p.Element(“Age”)
};
8. LINQ to SQL
• ウィザードを利用してDataContextクラス、
Table<TEntity>クラスを作成している
var query = from p in dtc.People
where p.Gender == 1
orderby p.Age
select new { p.Name, p.Age };
9. LINQの仕組み ー その1
• クエリ式はラムダ式を引数にとる拡張メソッドが
連結された形式に変換される
var query = from p in People
where p.Gender == 1
orderby p.Age
select new { p.Name, p.Age };
var query = People.Where(p => p.Gender == 1)
.OrderBy(p => p.Age)
.Select(p => new { p.Name, p.Age });
10. LINQの仕組み ー その2
• 対象となるデータにより呼び出される拡張メ
ソッドが異なる
– System.LINQ.Enumerable.xxx
• LINQ to Object
– 配列、LIST<T>がIEnumerableを継承
• LINQ to XML
– Xelement.Decentants()がIEnumerableを返す
• yieldによる実装 → 遅延実行
– System.LINQ.Queryable.xxx
• LINQ to SQL
– System.Data.Linq.Table<Tentity>がIQueryableを継承
• ラムダ式の右辺を積んで式のツリー(Expression Tree)を
作成
• IQuaryProviderによる実装 → 遅延実行
• 継承して独自のLINQ to XXX といった仕組みを構築可能
11. LINQの仕組み ー その3
• 遅延実行
– データが実際に必要となるタイミングまでクエリ条件は積み重
ねられていく
• LINQ to SQLでは積み重ねられたクエリでSQL文が生成
var query0 = from p in dtc.People
where p.Gender == 1
select p;
var query = from p in query0
where p.Age > 20
orderby p.Age
select new { p.Name, p.Age };
SELECT [t0].[Name], [t0].[Age]
FROM [dbo].[People] AS [t0]
WHERE ([t0].[Age] > @p0) AND ([t0].[Gender] = @p1)
ORDER BY [t0].[Age]
12. LINQと同等の処理をC# 2.0で
• whereとselectを書き換える
1. 拡張メソッドの実装
2. ラムダ式を利用した拡張メソッド呼び出しに
変換
3. ラムダ式をdelegateに変換
4. whereをFindAllに置き換え
5. selectを拡張メソッドから通常のメソッド呼び
出しに変換
• LINQ to Objectのみが可能
– LINQ to XMLやLINQ to SQLは専用のクラスの導
入により実装されている