SlideShare uma empresa Scribd logo
1 de 41
« LINQ 快速上手 »
多奇數位創意有限公司
技術總監 黃保翕 ( Will 保哥 )
部落格:http://blog.miniasp.com/
LINQ 簡介
Introducing LINQ
LINQ is one of Microsoft's most
exciting, powerful new development
technologies.
from MSDN (2009)
什麼是 LINQ
• 全名:Language INtegrated Query
• LINQ 是 Visual Studio 2008 引進的一組功能,可
將強大的查詢功能擴充至 C# 和 Visual Basic 的
語言語法。 ( C# 3.0 )
• LINQ 推出標準且容易學習的資料查詢與更新模式,
而且這項技術可擴充為支援幾乎所有類型的資料
存放區。
• Visual Studio 包括 LINQ 提供者組件,可讓您使
用 LINQ 搭配 .NET Framework 集合、SQL
Server 資料庫、ADO.NET 資料集和 XML 文件。
4
LINQ to Objects
• LINQ to Object 可以針對所有實作 IEnumerable
或 IEnumerable<T>泛型介面的集合物件進行查詢
或更新。
– Array, ArrayList, IList, …
– ILists<T>, Collection<T>, IQueryable<T>, …
• 範例
5
範例:對資料進行篩選 ( C# 2.0 )
6
範例:對資料進行篩選 ( C# 3.0 )
7
LINQ to SQL
• LINQ to SQL 可以針對 SQL Server 資料庫
中的資料進行查詢或更新。
• 範例
– 以北風資料庫為例
http://go.microsoft.com/fwlink/?linkid=30196
8
範例:對資料進行篩選 ( C# 2.0 )
範例:對資料進行篩選 ( C# 3.0 )
10
LINQ to XML
• LINQ to XML 可以針對記憶體中的 XML 資料
進行查詢或更新。
11
範例:對資料進行篩選 ( C# 3.0 )
12
LINQ to Wikipedia
• LINQ to Wikipedia 是一個自訂的 LINQ 查詢
提供者,透過 Mediawiki API 進行實作,提供
一個 LINQ 查詢介面,可以針對 Wikipedia 網
站的內容進行查詢。
13
LINQ 的重要特性
• 獨立於資料來源
– 使用統一的查詢語法(LINQ)查詢資料
• 強型別 & 編譯時期檢查
– T-SQL 是個語法,以字串表示,無法進行編譯
– LINQ 是個語法,以 C# 表示 (強型別),可編譯
• 延遲執行 / 延遲載入
– 建立完查詢時,並沒有真正執行查詢命令
– 透過 ToList() 或透過 foreach 才會真的開始執行
• 比「查詢」多更多!
– 可結合函式語言特性、平行處理、reactive programming
– 不僅僅改變了處裡資料的方法,更改變了思考問題的方式14
LINQ 架構
15
.NET 3.5 FCL 內建的 LINQ 提供者
• LINQ to Objects
– 提供 .NET 物件 在 LINQ 查詢相關的類別庫實作
• LINQ to SQL
– 提供 SQL Server 在 LINQ 查詢相關的類別庫實作
• LINQ to XML
– 提供 XML 物件 在 LINQ 查詢相關的類別庫實作
• LINQ to DataSets
– 提供 DataSet 物件 在 LINQ 查詢相關的類別庫實作
• LINQ to Entities
– 提供 關聯式資料庫 在 LINQ 查詢相關的類別庫實作
16
支援 LINQ 的程式語言
• 官方支援
– C# 3.0+
– VB 9.0+
• 語言特性
– 查詢語法 ( from … in … where … select … )
– 匿名型別與靜態型別推導
– 擴充方法
– Lambda 表達式
17
C# 的演進
C# 1.0
C# 2.0
C# 3.0
Managed Code (BCL, FCL)
Generics (泛型)
Language Integrated Query (LINQ)
C# 4.0
Dynamic Programming
PDC2008: The Future of C#
C# 2.0
• C# 2.0
– 部分類別 ( Partial class )
– 泛型 ( Generics )  List<T>
– 靜態類別 ( Static classes )  static
– 產生器功能 ( Generator functionality )  yield
• IEnumerable<T>
– 匿名委派 ( Anonymous delegates )  delegate
– 委派的協變與逆變 ( Delegate covariance and contravariance )
– 屬性 (Property) 的 get / set 存取子可不同存取性
( The accessibility of property accessors can be set independently )
– 允許空值的實值型別 ( Nullable types )  int?
– null 聯合運算子 ( Null-coalescing operator )  ?? 19
C# 3.0
• C# 3.0
– LINQ 查詢運算式 (language-integrated query)
– 物件和集合初始設定式 ( Object and Collection initializers )
– 匿名型別 ( Anonymous types )
– 隱含類型區域變數 ( Local variable type inference )
– Lambda 運算式 ( Lambda expressions )
– 運算式樹狀架構 ( Expression trees )
– 自動實作的屬性 ( Automatic properties )
– 擴充方法 ( Extension methods )
– 部分類別和方法 ( Partial class and methods )
20
C# 4.0
• C# 4.0
– 動態型別 ( Dynamic member lookup )
– 泛型中的共變數和反變數
( Covariant and contravariant generic type parameters )
– 選擇性參數與具名參數
( Optional parameters and named arguments )
– 使用 COM Interop 物件時不用再加上 ref 關鍵字
( Optional ref keyword when using COM )
– 在 COM Interop 程式設計中使用索引的屬性
( Indexed properties )
21
泛型與 LINQ 命名空間
• System.Collections.Generic
– 包含會定義泛型集合的介面和類別,可讓使用者建立
強型別集合,提供比起非泛型強型別集合更佳的型別
安全和效能。
• System.Linq
– 提供能夠支援查詢使用 LINQ 的類別和介面。
• System.Linq.Expressions
– 包含類別、介面和列舉,可使用運算式樹狀結構格式
將這些語言層級程式碼運算式表示為物件。
※ LINQ 全名是 Language-Integrated Query 22
開始使用 LINQ 查詢
Getting Started with LINQ in C#
關於 LINQ 查詢
• 所有的 LINQ 查詢 皆包含以下三步驟
– 取得資料來源
– 建立查詢
( LINQ 查詢運算式 )
– 執行查詢
24
1. 取得資料來源
25
2. 建立查詢 ( LINQ 查詢運算式 )
• Enumerable 方法
– Restriction: Where, OfType
– Projection: Select, SelectMany
– Ordering: OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse
– Join: Join, GroupJoin
– Grouping: GroupBy
– Set: Zip, Distinct, Union, Intersect, Except
– Aggregation: Aggregate, Count, LongCount, Sum, Min, Max, Average
– Partitioning: Take, TakeWhile, Skip, SkipWhile
– Cancatening: Concat
– Conversion:ToArray, ToList, ToDictionary, ToLookup, Cast
– Equality: SequenceEqual
– Elements: First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault,
ElementAt, ElementAtOrDefault, DefaultIfEmpty
– Generation: Range, Repeat, Empty
– Qualifiers: Any, All, Contains
26
3. 執行查詢
• IEnumerable and IEnumerable<T>
• 免除所有基礎的原理,用 foreach 就對了!
• 執行 foreach 時同時逐步取得集合物件的內容
( 並非一次將資料抓完,而是抓一筆算一筆 )
• 延遲載入 v.s. 預先載入
27
LINQ 的兩種寫法
• 編程式 (Imperative)  λ ( 讀音: lambda )
IEnumerable<int> results = source
.Where(integer => integer > 0)
.OrderByDescending(integer => integer);
• 宣告式 (Declarative)  LINQ ( 讀音: Link )
var results = from integer in source
where integer > 0
orderby integer descending
select integer; 28
LINQ 查詢語法一覽
29
練習各式 LINQ 查詢
Practices
基本資料過濾
• 取得資料來源
int[] source = new int[] { 0, -5, 12, -54, 5, -67, 3, 6 };
string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };
• 建立查詢
– 請在 LINQPad 中撰寫程式碼 ( 各使用 LINQ 與 λ 語法)
• 篩選出 source 陣列中小於 0 的數字
• 篩選出 names 陣列中字串長度大於 3 個字元的字串
var data = …;
• 執行查詢
data.Dump();
32
流體風格(Fluent Syntax)
• 取得資料來源
string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };
• 建立查詢
IEnumerable<string> query = names
.Where (n => n.Contains ("a"))
.OrderBy (n => n.Length)
.Select (n => n.ToUpper());
• 執行查詢
query.Dump();
33
透過 LINQPad 翻譯 λ 程式寫法
• 來源資料 ( IEnumerable<T> )
var names = new[] { "Tom", "Dick", "Harry", "Mary",
"Jay" };
• 來源資料 ( IQueryable<T> )
var names = new[] { "Tom", "Dick", "Harry", "Mary",
"Jay" }.AsQueryable();
34
混搭 LINQ 與 λ 語法
• (from n in names where n.Contains ("a") select n).Count()
• (from n in names orderby n select n).First()
• names.Where (n => n.Contains ("a")).Count()
• names.OrderBy (n => n).First()
35
延遲載入 v.s. 預先載入
• 標示粗體的都是「預先載入」的方法,加上 [ ] 的都是最佳化過的方法
– Restriction: Where, OfType
– Projection: Select, SelectMany
– Ordering: OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse
– Join: Join, GroupJoin
– Grouping: GroupBy
– Set: Zip, Distinct, Union, Intersect, Except
– Aggregation: Aggregate, [Count], LongCount, Sum, Min, Max, Average
– Partitioning: Take, TakeWhile, Skip, SkipWhile
– Cancatening: Concat
– Conversion: ToArray, ToList, ToDictionary, ToLookup, [Cast]
– Equality: SequenceEqual
– Elements: [First], [FirstOrDefault], [Last], [LastOrDefault],
[Single], [SingleOrDefault], [ElementAt], [ElementAtOrDefault],
DefaultIfEmpty
– Generation: Range, Repeat, Empty
– Qualifiers: Any, All, [Contains]
36
延遲載入範例
• 建立清單
– var numbers = new List<int>();
– numbers.Add (1);
• 建立查詢
– IEnumerable<int> query = numbers.Select (n => n * 10);
• 增加清單項目
– numbers.Add (2);
• 執行查詢
– query.Dump();
37
※ 請回答 query 輸出的結果為何?
預先載入範例
• 建立清單
– var numbers = new List<int>() { 1, 2 };
• 建立查詢並且預先載入資料
– List<int> timesTen = numbers.Select (n => n *
10).ToList();
• 清空清單項目
– numbers.Clear();
• 執行查詢
– timesTen.Dump();
38
※ 請回答 timesTen 輸出的結果為何?
閉包範例
int[] numbers = { 1, 2 };
int factor = 10;
IEnumerable<int> query = numbers.Select (n => n * factor);
factor = 20;
query.Dump ();
39
※ 請回答 query 輸出的結果為何?
子查詢範例
names.Where(n => n.Length == names.OrderBy (n2 => n2.Length)
.Select (n2 => n2.Length).First())
.Dump();
var query =
(
from n in names
where n.Length == (from n2 in names orderby n2.Length select n2.Length).First()
select n
).Dump();
40
※ 少用子查詢,因為效能不好!
相關連結
• LINQ via C#
• LINQ (Language-Integrated Query) [中文]
• LINQ 查詢運算式 (C# 程式設計手冊)
聯絡資訊
• The Will Will Web
記載著 Will 在網路世界的學習心得與技術分享
– http://blog.miniasp.com/
• Will 保哥的技術交流中心 (臉書粉絲專頁)
– http://www.facebook.com/will.fans
• Will 保哥的噗浪
– http://www.plurk.com/willh/invite

Mais conteúdo relacionado

Mais procurados

MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MicroAd, Inc.(Engineer)
 
Linux女子部 iptables復習編
Linux女子部 iptables復習編Linux女子部 iptables復習編
Linux女子部 iptables復習編Etsuji Nakai
 
RestfulなAPIの設計のお話
RestfulなAPIの設計のお話RestfulなAPIの設計のお話
RestfulなAPIの設計のお話ftsan
 
HA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedHA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedGanapathi Kandaswamy
 
Developing SDN apps in Ryu
Developing SDN apps in RyuDeveloping SDN apps in Ryu
Developing SDN apps in RyuChe Wei Lin
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)Tetsuya Hasegawa
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistreammganeko
 
自宅サーバラックの勧め BGP4編
自宅サーバラックの勧め BGP4編自宅サーバラックの勧め BGP4編
自宅サーバラックの勧め BGP4編h-otter
 
Shodan- That Device Search Engine
Shodan- That Device Search EngineShodan- That Device Search Engine
Shodan- That Device Search EngineInMobi Technology
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話Kazuho Oku
 
Telemetry事始め
Telemetry事始めTelemetry事始め
Telemetry事始めnpsg
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略Yasutomo Uemori
 
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 54章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 5mao999
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Yoshiki Shibukawa
 
UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編hdais
 

Mais procurados (20)

MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
 
Linux女子部 iptables復習編
Linux女子部 iptables復習編Linux女子部 iptables復習編
Linux女子部 iptables復習編
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
RestfulなAPIの設計のお話
RestfulなAPIの設計のお話RestfulなAPIの設計のお話
RestfulなAPIの設計のお話
 
mTCP使ってみた
mTCP使ってみたmTCP使ってみた
mTCP使ってみた
 
HA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and KeepalivedHA Deployment Architecture with HAProxy and Keepalived
HA Deployment Architecture with HAProxy and Keepalived
 
Developing SDN apps in Ryu
Developing SDN apps in RyuDeveloping SDN apps in Ryu
Developing SDN apps in Ryu
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)
SSHパケットの復号ツールを作ろう_v1(Decrypt SSH .pcap File)
 
GitLabで始めるDevOps入門
GitLabで始めるDevOps入門GitLabで始めるDevOps入門
GitLabで始めるDevOps入門
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistream
 
自宅サーバラックの勧め BGP4編
自宅サーバラックの勧め BGP4編自宅サーバラックの勧め BGP4編
自宅サーバラックの勧め BGP4編
 
Shodan- That Device Search Engine
Shodan- That Device Search EngineShodan- That Device Search Engine
Shodan- That Device Search Engine
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話TLS 1.3 と 0-RTT のこわ〜い話
TLS 1.3 と 0-RTT のこわ〜い話
 
Telemetry事始め
Telemetry事始めTelemetry事始め
Telemetry事始め
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略
 
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 54章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 5
 
Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察Chunked encoding を使った高速化の考察
Chunked encoding を使った高速化の考察
 
UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編UnboundとNSDの紹介 BIND9との比較編
UnboundとNSDの紹介 BIND9との比較編
 

Destaque

Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課Sean Lu
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略Will Huang
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索Will Huang
 
Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Will Huang
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例Will Huang
 
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)Will Huang
 
ASP.NET MVC 5 新功能探索
ASP.NET MVC 5 新功能探索ASP.NET MVC 5 新功能探索
ASP.NET MVC 5 新功能探索Will Huang
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Will Huang
 
開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽Will Huang
 
簡介 GitHub 平台
簡介 GitHub 平台簡介 GitHub 平台
簡介 GitHub 平台Will Huang
 
快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架Will Huang
 
從開發人員角度十分鐘理解區塊鏈技術
從開發人員角度十分鐘理解區塊鏈技術從開發人員角度十分鐘理解區塊鏈技術
從開發人員角度十分鐘理解區塊鏈技術Will Huang
 
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)Will Huang
 
ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站twMVC
 
Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4Kyle Shen
 
2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)
2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)
2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)Win Yu
 
《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊
《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊
《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊Will Huang
 
如何將現有 Web form 轉換到mvc
如何將現有 Web form 轉換到mvc如何將現有 Web form 轉換到mvc
如何將現有 Web form 轉換到mvcGelis Wu
 
簡介 Git hub 平台 ( 1.5 hrs )
簡介 Git hub 平台 ( 1.5 hrs )簡介 Git hub 平台 ( 1.5 hrs )
簡介 Git hub 平台 ( 1.5 hrs )Will Huang
 
git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用Will Huang
 

Destaque (20)

Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
 
Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)Visual Studio 2017 新功能探索 (Study4.TW)
Visual Studio 2017 新功能探索 (Study4.TW)
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
 
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
 
ASP.NET MVC 5 新功能探索
ASP.NET MVC 5 新功能探索ASP.NET MVC 5 新功能探索
ASP.NET MVC 5 新功能探索
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰
 
開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽開發人員不可不知的 Windows Container 容器技術預覽
開發人員不可不知的 Windows Container 容器技術預覽
 
簡介 GitHub 平台
簡介 GitHub 平台簡介 GitHub 平台
簡介 GitHub 平台
 
快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架快快樂樂學 Angular 2 開發框架
快快樂樂學 Angular 2 開發框架
 
從開發人員角度十分鐘理解區塊鏈技術
從開發人員角度十分鐘理解區塊鏈技術從開發人員角度十分鐘理解區塊鏈技術
從開發人員角度十分鐘理解區塊鏈技術
 
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
 
ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站ASP.NET MVC 善用網路資源快速完打造網站
ASP.NET MVC 善用網路資源快速完打造網站
 
Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4Angular.js & ASP.NET in Study4
Angular.js & ASP.NET in Study4
 
2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)
2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)
2016 ModernWeb 分享 - 恰如其分 MySQL 程式設計 (修)
 
《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊
《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊
《多奇線上講堂》如何用 Outlook 和 OWA 整理聯絡人資訊
 
如何將現有 Web form 轉換到mvc
如何將現有 Web form 轉換到mvc如何將現有 Web form 轉換到mvc
如何將現有 Web form 轉換到mvc
 
簡介 Git hub 平台 ( 1.5 hrs )
簡介 Git hub 平台 ( 1.5 hrs )簡介 Git hub 平台 ( 1.5 hrs )
簡介 Git hub 平台 ( 1.5 hrs )
 
git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用git merge 與 rebase 的觀念與實務應用
git merge 與 rebase 的觀念與實務應用
 

Semelhante a 保哥線上講堂:LINQ 快速上手

Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南HonestQiao
 
Study4.TW .NET Conf 2018 - Fp in c#
Study4.TW .NET Conf 2018  - Fp in c#Study4.TW .NET Conf 2018  - Fp in c#
Study4.TW .NET Conf 2018 - Fp in c#Chieh Kai Yang
 
Angular 开发技巧 (2018 ngChina 开发者大会)
Angular 开发技巧 (2018 ngChina 开发者大会)Angular 开发技巧 (2018 ngChina 开发者大会)
Angular 开发技巧 (2018 ngChina 开发者大会)Will Huang
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & developmentXuefeng Zhang
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisXiaoming Chen
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享zenyuhao
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
Hands on data analysis 101
Hands on data analysis 101Hands on data analysis 101
Hands on data analysis 101FEG
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础wklken
 
02.python基础
02.python基础02.python基础
02.python基础modou li
 
COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺宗凡 楊
 
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺hydai
 
Elastic stack day-1
Elastic stack day-1Elastic stack day-1
Elastic stack day-1YI-CHING WU
 
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509tidesq
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdfczzz1
 

Semelhante a 保哥線上講堂:LINQ 快速上手 (20)

Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南
 
Study4.TW .NET Conf 2018 - Fp in c#
Study4.TW .NET Conf 2018  - Fp in c#Study4.TW .NET Conf 2018  - Fp in c#
Study4.TW .NET Conf 2018 - Fp in c#
 
Angular 开发技巧 (2018 ngChina 开发者大会)
Angular 开发技巧 (2018 ngChina 开发者大会)Angular 开发技巧 (2018 ngChina 开发者大会)
Angular 开发技巧 (2018 ngChina 开发者大会)
 
N-layer design & development
N-layer design & developmentN-layer design & development
N-layer design & development
 
Baidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log AnalysisBaidu LSP and DISQL for Log Analysis
Baidu LSP and DISQL for Log Analysis
 
LabView with Lego NXT
LabView  with Lego NXTLabView  with Lego NXT
LabView with Lego NXT
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
Hands on data analysis 101
Hands on data analysis 101Hands on data analysis 101
Hands on data analysis 101
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Python 脚本入门基础
Python 脚本入门基础Python 脚本入门基础
Python 脚本入门基础
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
02.python基础
02.python基础02.python基础
02.python基础
 
COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺
 
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺
 
Elastic stack day-1
Elastic stack day-1Elastic stack day-1
Elastic stack day-1
 
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
Linq 入门
Linq 入门Linq 入门
Linq 入门
 

Mais de Will Huang

深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)Will Huang
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境Will Huang
 
ASP.NET Core 6.0 全新功能探索
ASP.NET Core 6.0 全新功能探索ASP.NET Core 6.0 全新功能探索
ASP.NET Core 6.0 全新功能探索Will Huang
 
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!Will Huang
 
你一定不能不知道的 Markdown 寫作技巧
你一定不能不知道的 Markdown 寫作技巧你一定不能不知道的 Markdown 寫作技巧
你一定不能不知道的 Markdown 寫作技巧Will Huang
 
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)Will Huang
 
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)Will Huang
 
Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)Will Huang
 
從實戰經驗看到的 K8S 導入痛點
從實戰經驗看到的 K8S 導入痛點從實戰經驗看到的 K8S 導入痛點
從實戰經驗看到的 K8S 導入痛點Will Huang
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門Will Huang
 
极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)Will Huang
 
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)Will Huang
 
Protractor: The Hacker way (NG-MY 2019)
Protractor: The Hacker way (NG-MY 2019)Protractor: The Hacker way (NG-MY 2019)
Protractor: The Hacker way (NG-MY 2019)Will Huang
 
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)Will Huang
 
Angular 7 全新功能探索 (Angular Taiwan 2018)
Angular 7 全新功能探索 (Angular Taiwan 2018)Angular 7 全新功能探索 (Angular Taiwan 2018)
Angular 7 全新功能探索 (Angular Taiwan 2018)Will Huang
 
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)Will Huang
 
AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)Will Huang
 
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)Will Huang
 
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
全新 Windows Server 2019 容器技術及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)全新 Windows Server 2019 容器技術及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)Will Huang
 
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)Will Huang
 

Mais de Will Huang (20)

深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
深入理解 CVE-2022-24765 漏洞的攻擊與防護策略 (Git v2.35.2)
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
 
ASP.NET Core 6.0 全新功能探索
ASP.NET Core 6.0 全新功能探索ASP.NET Core 6.0 全新功能探索
ASP.NET Core 6.0 全新功能探索
 
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
 
你一定不能不知道的 Markdown 寫作技巧
你一定不能不知道的 Markdown 寫作技巧你一定不能不知道的 Markdown 寫作技巧
你一定不能不知道的 Markdown 寫作技巧
 
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
使用 .NET 5 實現美股期貨的量化交易策略 (.NET Conf 2020)
 
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
 
Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)
 
從實戰經驗看到的 K8S 導入痛點
從實戰經驗看到的 K8S 導入痛點從實戰經驗看到的 K8S 導入痛點
從實戰經驗看到的 K8S 導入痛點
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門
 
极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)
 
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
你不可不知的 ASP.NET Core 3 全新功能探索 (.NET Conf 2019)
 
Protractor: The Hacker way (NG-MY 2019)
Protractor: The Hacker way (NG-MY 2019)Protractor: The Hacker way (NG-MY 2019)
Protractor: The Hacker way (NG-MY 2019)
 
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
邁向 Windows Server 應用程式現代化 (Windows Server Application Modernization)
 
Angular 7 全新功能探索 (Angular Taiwan 2018)
Angular 7 全新功能探索 (Angular Taiwan 2018)Angular 7 全新功能探索 (Angular Taiwan 2018)
Angular 7 全新功能探索 (Angular Taiwan 2018)
 
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
利用.NET Core 與 Azure Kubernetes Service (AKS) 建立高彈性 Microservices (Azure TechDay)
 
AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)AKS 與開發人員體驗 (Kubernetes 大講堂)
AKS 與開發人員體驗 (Kubernetes 大講堂)
 
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
使用 ASP.NET Blazor 開發 SPA 網頁應用程式 (.NET Conf 2018)
 
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
全新 Windows Server 2019 容器技術及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)全新 Windows Server 2019 容器技術及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
 
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
 

保哥線上講堂:LINQ 快速上手

  • 1. « LINQ 快速上手 » 多奇數位創意有限公司 技術總監 黃保翕 ( Will 保哥 ) 部落格:http://blog.miniasp.com/
  • 3. LINQ is one of Microsoft's most exciting, powerful new development technologies. from MSDN (2009)
  • 4. 什麼是 LINQ • 全名:Language INtegrated Query • LINQ 是 Visual Studio 2008 引進的一組功能,可 將強大的查詢功能擴充至 C# 和 Visual Basic 的 語言語法。 ( C# 3.0 ) • LINQ 推出標準且容易學習的資料查詢與更新模式, 而且這項技術可擴充為支援幾乎所有類型的資料 存放區。 • Visual Studio 包括 LINQ 提供者組件,可讓您使 用 LINQ 搭配 .NET Framework 集合、SQL Server 資料庫、ADO.NET 資料集和 XML 文件。 4
  • 5. LINQ to Objects • LINQ to Object 可以針對所有實作 IEnumerable 或 IEnumerable<T>泛型介面的集合物件進行查詢 或更新。 – Array, ArrayList, IList, … – ILists<T>, Collection<T>, IQueryable<T>, … • 範例 5
  • 8. LINQ to SQL • LINQ to SQL 可以針對 SQL Server 資料庫 中的資料進行查詢或更新。 • 範例 – 以北風資料庫為例 http://go.microsoft.com/fwlink/?linkid=30196 8
  • 11. LINQ to XML • LINQ to XML 可以針對記憶體中的 XML 資料 進行查詢或更新。 11
  • 13. LINQ to Wikipedia • LINQ to Wikipedia 是一個自訂的 LINQ 查詢 提供者,透過 Mediawiki API 進行實作,提供 一個 LINQ 查詢介面,可以針對 Wikipedia 網 站的內容進行查詢。 13
  • 14. LINQ 的重要特性 • 獨立於資料來源 – 使用統一的查詢語法(LINQ)查詢資料 • 強型別 & 編譯時期檢查 – T-SQL 是個語法,以字串表示,無法進行編譯 – LINQ 是個語法,以 C# 表示 (強型別),可編譯 • 延遲執行 / 延遲載入 – 建立完查詢時,並沒有真正執行查詢命令 – 透過 ToList() 或透過 foreach 才會真的開始執行 • 比「查詢」多更多! – 可結合函式語言特性、平行處理、reactive programming – 不僅僅改變了處裡資料的方法,更改變了思考問題的方式14
  • 16. .NET 3.5 FCL 內建的 LINQ 提供者 • LINQ to Objects – 提供 .NET 物件 在 LINQ 查詢相關的類別庫實作 • LINQ to SQL – 提供 SQL Server 在 LINQ 查詢相關的類別庫實作 • LINQ to XML – 提供 XML 物件 在 LINQ 查詢相關的類別庫實作 • LINQ to DataSets – 提供 DataSet 物件 在 LINQ 查詢相關的類別庫實作 • LINQ to Entities – 提供 關聯式資料庫 在 LINQ 查詢相關的類別庫實作 16
  • 17. 支援 LINQ 的程式語言 • 官方支援 – C# 3.0+ – VB 9.0+ • 語言特性 – 查詢語法 ( from … in … where … select … ) – 匿名型別與靜態型別推導 – 擴充方法 – Lambda 表達式 17
  • 18. C# 的演進 C# 1.0 C# 2.0 C# 3.0 Managed Code (BCL, FCL) Generics (泛型) Language Integrated Query (LINQ) C# 4.0 Dynamic Programming PDC2008: The Future of C#
  • 19. C# 2.0 • C# 2.0 – 部分類別 ( Partial class ) – 泛型 ( Generics )  List<T> – 靜態類別 ( Static classes )  static – 產生器功能 ( Generator functionality )  yield • IEnumerable<T> – 匿名委派 ( Anonymous delegates )  delegate – 委派的協變與逆變 ( Delegate covariance and contravariance ) – 屬性 (Property) 的 get / set 存取子可不同存取性 ( The accessibility of property accessors can be set independently ) – 允許空值的實值型別 ( Nullable types )  int? – null 聯合運算子 ( Null-coalescing operator )  ?? 19
  • 20. C# 3.0 • C# 3.0 – LINQ 查詢運算式 (language-integrated query) – 物件和集合初始設定式 ( Object and Collection initializers ) – 匿名型別 ( Anonymous types ) – 隱含類型區域變數 ( Local variable type inference ) – Lambda 運算式 ( Lambda expressions ) – 運算式樹狀架構 ( Expression trees ) – 自動實作的屬性 ( Automatic properties ) – 擴充方法 ( Extension methods ) – 部分類別和方法 ( Partial class and methods ) 20
  • 21. C# 4.0 • C# 4.0 – 動態型別 ( Dynamic member lookup ) – 泛型中的共變數和反變數 ( Covariant and contravariant generic type parameters ) – 選擇性參數與具名參數 ( Optional parameters and named arguments ) – 使用 COM Interop 物件時不用再加上 ref 關鍵字 ( Optional ref keyword when using COM ) – 在 COM Interop 程式設計中使用索引的屬性 ( Indexed properties ) 21
  • 22. 泛型與 LINQ 命名空間 • System.Collections.Generic – 包含會定義泛型集合的介面和類別,可讓使用者建立 強型別集合,提供比起非泛型強型別集合更佳的型別 安全和效能。 • System.Linq – 提供能夠支援查詢使用 LINQ 的類別和介面。 • System.Linq.Expressions – 包含類別、介面和列舉,可使用運算式樹狀結構格式 將這些語言層級程式碼運算式表示為物件。 ※ LINQ 全名是 Language-Integrated Query 22
  • 23. 開始使用 LINQ 查詢 Getting Started with LINQ in C#
  • 24. 關於 LINQ 查詢 • 所有的 LINQ 查詢 皆包含以下三步驟 – 取得資料來源 – 建立查詢 ( LINQ 查詢運算式 ) – 執行查詢 24
  • 26. 2. 建立查詢 ( LINQ 查詢運算式 ) • Enumerable 方法 – Restriction: Where, OfType – Projection: Select, SelectMany – Ordering: OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse – Join: Join, GroupJoin – Grouping: GroupBy – Set: Zip, Distinct, Union, Intersect, Except – Aggregation: Aggregate, Count, LongCount, Sum, Min, Max, Average – Partitioning: Take, TakeWhile, Skip, SkipWhile – Cancatening: Concat – Conversion:ToArray, ToList, ToDictionary, ToLookup, Cast – Equality: SequenceEqual – Elements: First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault, ElementAt, ElementAtOrDefault, DefaultIfEmpty – Generation: Range, Repeat, Empty – Qualifiers: Any, All, Contains 26
  • 27. 3. 執行查詢 • IEnumerable and IEnumerable<T> • 免除所有基礎的原理,用 foreach 就對了! • 執行 foreach 時同時逐步取得集合物件的內容 ( 並非一次將資料抓完,而是抓一筆算一筆 ) • 延遲載入 v.s. 預先載入 27
  • 28. LINQ 的兩種寫法 • 編程式 (Imperative)  λ ( 讀音: lambda ) IEnumerable<int> results = source .Where(integer => integer > 0) .OrderByDescending(integer => integer); • 宣告式 (Declarative)  LINQ ( 讀音: Link ) var results = from integer in source where integer > 0 orderby integer descending select integer; 28
  • 31. 基本資料過濾 • 取得資料來源 int[] source = new int[] { 0, -5, 12, -54, 5, -67, 3, 6 }; string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; • 建立查詢 – 請在 LINQPad 中撰寫程式碼 ( 各使用 LINQ 與 λ 語法) • 篩選出 source 陣列中小於 0 的數字 • 篩選出 names 陣列中字串長度大於 3 個字元的字串 var data = …; • 執行查詢 data.Dump(); 32
  • 32. 流體風格(Fluent Syntax) • 取得資料來源 string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; • 建立查詢 IEnumerable<string> query = names .Where (n => n.Contains ("a")) .OrderBy (n => n.Length) .Select (n => n.ToUpper()); • 執行查詢 query.Dump(); 33
  • 33. 透過 LINQPad 翻譯 λ 程式寫法 • 來源資料 ( IEnumerable<T> ) var names = new[] { "Tom", "Dick", "Harry", "Mary", "Jay" }; • 來源資料 ( IQueryable<T> ) var names = new[] { "Tom", "Dick", "Harry", "Mary", "Jay" }.AsQueryable(); 34
  • 34. 混搭 LINQ 與 λ 語法 • (from n in names where n.Contains ("a") select n).Count() • (from n in names orderby n select n).First() • names.Where (n => n.Contains ("a")).Count() • names.OrderBy (n => n).First() 35
  • 35. 延遲載入 v.s. 預先載入 • 標示粗體的都是「預先載入」的方法,加上 [ ] 的都是最佳化過的方法 – Restriction: Where, OfType – Projection: Select, SelectMany – Ordering: OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse – Join: Join, GroupJoin – Grouping: GroupBy – Set: Zip, Distinct, Union, Intersect, Except – Aggregation: Aggregate, [Count], LongCount, Sum, Min, Max, Average – Partitioning: Take, TakeWhile, Skip, SkipWhile – Cancatening: Concat – Conversion: ToArray, ToList, ToDictionary, ToLookup, [Cast] – Equality: SequenceEqual – Elements: [First], [FirstOrDefault], [Last], [LastOrDefault], [Single], [SingleOrDefault], [ElementAt], [ElementAtOrDefault], DefaultIfEmpty – Generation: Range, Repeat, Empty – Qualifiers: Any, All, [Contains] 36
  • 36. 延遲載入範例 • 建立清單 – var numbers = new List<int>(); – numbers.Add (1); • 建立查詢 – IEnumerable<int> query = numbers.Select (n => n * 10); • 增加清單項目 – numbers.Add (2); • 執行查詢 – query.Dump(); 37 ※ 請回答 query 輸出的結果為何?
  • 37. 預先載入範例 • 建立清單 – var numbers = new List<int>() { 1, 2 }; • 建立查詢並且預先載入資料 – List<int> timesTen = numbers.Select (n => n * 10).ToList(); • 清空清單項目 – numbers.Clear(); • 執行查詢 – timesTen.Dump(); 38 ※ 請回答 timesTen 輸出的結果為何?
  • 38. 閉包範例 int[] numbers = { 1, 2 }; int factor = 10; IEnumerable<int> query = numbers.Select (n => n * factor); factor = 20; query.Dump (); 39 ※ 請回答 query 輸出的結果為何?
  • 39. 子查詢範例 names.Where(n => n.Length == names.OrderBy (n2 => n2.Length) .Select (n2 => n2.Length).First()) .Dump(); var query = ( from n in names where n.Length == (from n2 in names orderby n2.Length select n2.Length).First() select n ).Dump(); 40 ※ 少用子查詢,因為效能不好!
  • 40. 相關連結 • LINQ via C# • LINQ (Language-Integrated Query) [中文] • LINQ 查詢運算式 (C# 程式設計手冊)
  • 41. 聯絡資訊 • The Will Will Web 記載著 Will 在網路世界的學習心得與技術分享 – http://blog.miniasp.com/ • Will 保哥的技術交流中心 (臉書粉絲專頁) – http://www.facebook.com/will.fans • Will 保哥的噗浪 – http://www.plurk.com/willh/invite