開發網頁程式時,分頁功能總是少不掉的.......
然而不使用 skip 與 take 來過濾資料,全部交給 GridView 控制項處理也是可以......
以下是使用範例:
xxx.aspx
xxx.aspx.cs
然而若是使用 skip & take,就可以僅取得部份資料,讓分頁相關的程式撰寫上更加有彈性,以下是使用方式:
xxx.aspx
xxx.aspx.cs
執行結果
2009年8月19日 星期三
2009年8月16日 星期日
[Silverlight 3.0] 如何讓消失的 ASP.NET Silverlight 控制項重新出現
昨天安裝了 Silverlight 3.0 的開發環境準備來學習一下 Silverlight
結果看書上有 ASP.NET Silverlight 控制項,但我的 VS 2010 就硬是不給我出現,解決方式有兩種:
結果看書上有 ASP.NET Silverlight 控制項,但我的 VS 2010 就硬是不給我出現,解決方式有兩種:
- 安裝 Silverlight 2.0 SDK (沒錯......裝了 3.0 SDK 並不會有 2.0 SDK 有的東西....超怪....)
- 若不想安裝 2.0 SDK,則可以參考此篇文章,額外下載並加入 ASP.NET Server Controls for Silverlight Samples 即可
2009年8月13日 星期四
[LINQ] 常用語法介紹
根據特定條件取得資料 - Where
IEnumerable<T>.Where 可以協助將篩選出我們想要的資訊,共有兩種用法,首先介紹一般 where 的用法:
接著是另一種較為特別的用法,其中還將資料的 index 也考慮進來:
取得特定欄位資料 - Select
Enumerable.Select 用來取得我們所要得資料欄位或是物件,使用上除了可用 LINQ 的語法之外,亦可透過 Extension Method 的特性來使用 Select。
首先介紹透過 LINQ 語法來使用 Select:
接著是使用 Extension Method:
此外,LINQ 還提供了一個 Enumerable.SelectMany 的語法,可以將取得的集合物件直接展開使用,以下用範例說明:
去除重複 - Distinct
與 SQL 語法相同,LINQ 中也提供了 Distinct 來過濾掉重複的資料:
將 query 後的資料轉為其他集合型態
在 LINQ 中提供了 ToList()、ToArray()、ToDictionary 等方法將 query 後的資料轉為不同的集合型態來使用,但有一點需要注意,.NET 處理的方式是「複製一份資料集合」。
因此,若是 query 得到的資料很龐大,想當然而呼叫 ToList() 或是 ToArray() 這一類的方法就會很耗費系統資源,使用上就必須要注意一下。
聚合函數(Arregation Functions)
LINQ 中也提供了許多聚合函數,例如:Max、Min、Sum、Count ... 等等,以下介紹使用方式:
根據條件取得資料後,也許還會有排序的需求,當然 LINQ 也提供了排序的語法 Enumerable.OrderBy,以下介紹其使用方式:
LINQ 在語法上的使用彈性可見一班!
巢狀搜尋(Nested Query)
從上面的範例到至今,我們都是以 Book 為主的搜尋,根據不同的條件取得不同的資料。
假設我們要改以 Publisher 為主來搜尋呢? 假設要搜尋的資料是不同的 Publisher 所出版的書籍清單,這該怎麼作呢?
由於每個 Publisher 出版的書籍數量不一定是僅有一本,因此搜尋出來的資料就肯定無法用 row by row 的方式來呈現;而是必須取得 Publisher 清單後,再根據每個 Publisher 取得相對應的出版書籍。
因此我們可以將目標設定在取得類似以下資料:
可以用以下語法達成:
當然 aspx 中也要有相對應的 GridView 設定:
執行結果如下:
群組(Grouping)
以上面為例,若是要達到相同效果,也可以改用 Group 的方式,而且透過 Group 的方式取得資料,沒有出版書的 Publisher 就不會出現囉!
aspx 的部分就跟 Nested Query 中的相同!
執行結果如下:
仔細觀察程式碼,其中的 PublisherBooks 為 LINQ 處理後所會回傳的群組資料(根據 book.Publisher 分群),而 PublisherBooks 則會預設實作 IGrouping 介面。
實作 IGrouping 介面即表示這群資料集合中,都擁有相同的 key 值,也就是作為分群條件的 book.Publisher。
跟 Nested query 相比較,使用 Group 的方式取得資料至少有兩樣優點:
Joins
既然 LINQ 是針對資料集合進行處理,那怎麼會少掉 Join 這個強大的語法呢?
以下用 Join 語法來達到上面範例分群組的功能:
aspx 的部分也是跟先前的範例相同!
執行結果如下:
而從這範例結果可以看出,沒有出版書籍的 Publisher 也會一並被列出(跟 Nested Query 的結果相同),而若是要避開這種情況,可以改用其他 Join 的方式。
Inner Join
這是一般最常用的 join 方式,會過濾掉沒有符合資料的紀錄,以下是使用方式:
執行結果如下:
Left Outer Join
若是要留下 join 中沒有比對符合資料的紀錄,就必須改用 Left(Right) Outer Join 了,但 LINQ 中並沒有提供語法可以直接作到,因此要搭配 DefaultIfEmpty 方法來達到此效果:
執行結果如下:
Cross Join
這個就是有名的 Cartesian Product(卡氏積),會將 Join 兩方所有可能的組合通通列出,在 LINQ 中要達到這樣的效果,可以用下列的方式:
以下是程式執行結果:
IEnumerable<T>.Where 可以協助將篩選出我們想要的資訊,共有兩種用法,首先介紹一般 where 的用法:
接著是另一種較為特別的用法,其中還將資料的 index 也考慮進來:
取得特定欄位資料 - Select
Enumerable.Select 用來取得我們所要得資料欄位或是物件,使用上除了可用 LINQ 的語法之外,亦可透過 Extension Method 的特性來使用 Select。
首先介紹透過 LINQ 語法來使用 Select:
接著是使用 Extension Method:
此外,LINQ 還提供了一個 Enumerable.SelectMany 的語法,可以將取得的集合物件直接展開使用,以下用範例說明:
去除重複 - Distinct
與 SQL 語法相同,LINQ 中也提供了 Distinct 來過濾掉重複的資料:
將 query 後的資料轉為其他集合型態
在 LINQ 中提供了 ToList()、ToArray()、ToDictionary 等方法將 query 後的資料轉為不同的集合型態來使用,但有一點需要注意,.NET 處理的方式是「複製一份資料集合」。
因此,若是 query 得到的資料很龐大,想當然而呼叫 ToList() 或是 ToArray() 這一類的方法就會很耗費系統資源,使用上就必須要注意一下。
聚合函數(Arregation Functions)
LINQ 中也提供了許多聚合函數,例如:Max、Min、Sum、Count ... 等等,以下介紹使用方式:
排序(Sorting)
根據條件取得資料後,也許還會有排序的需求,當然 LINQ 也提供了排序的語法 Enumerable.OrderBy,以下介紹其使用方式:
從上面的 orderby 使用方式可以發現,可以同時進行不同欄位資料的排序,而這一段 query,.NET Framework 是怎麼幫我們達成的呢?
其實是將這一段語法拆成三段語法而成的:
LINQ 在語法上的使用彈性可見一班!
巢狀搜尋(Nested Query)
從上面的範例到至今,我們都是以 Book 為主的搜尋,根據不同的條件取得不同的資料。
假設我們要改以 Publisher 為主來搜尋呢? 假設要搜尋的資料是不同的 Publisher 所出版的書籍清單,這該怎麼作呢?
由於每個 Publisher 出版的書籍數量不一定是僅有一本,因此搜尋出來的資料就肯定無法用 row by row 的方式來呈現;而是必須取得 Publisher 清單後,再根據每個 Publisher 取得相對應的出版書籍。
因此我們可以將目標設定在取得類似以下資料:
- Publisher(出版商) -> Books(出版書籍清單)
- Publisher(出版商) -> Books(出版書籍清單)
- ..... (etc)
可以用以下語法達成:
當然 aspx 中也要有相對應的 GridView 設定:
執行結果如下:
群組(Grouping)
以上面為例,若是要達到相同效果,也可以改用 Group 的方式,而且透過 Group 的方式取得資料,沒有出版書的 Publisher 就不會出現囉!
aspx 的部分就跟 Nested Query 中的相同!
執行結果如下:
仔細觀察程式碼,其中的 PublisherBooks 為 LINQ 處理後所會回傳的群組資料(根據 book.Publisher 分群),而 PublisherBooks 則會預設實作 IGrouping 介面。
實作 IGrouping 介面即表示這群資料集合中,都擁有相同的 key 值,也就是作為分群條件的 book.Publisher。
跟 Nested query 相比較,使用 Group 的方式取得資料至少有兩樣優點:
- 查詢語法更加精簡
- 可在查詢語法中對群組命名,以便後續使用(例如:與 aggregation function 進行搭配使用)
Joins
既然 LINQ 是針對資料集合進行處理,那怎麼會少掉 Join 這個強大的語法呢?
以下用 Join 語法來達到上面範例分群組的功能:
aspx 的部分也是跟先前的範例相同!
執行結果如下:
而從這範例結果可以看出,沒有出版書籍的 Publisher 也會一並被列出(跟 Nested Query 的結果相同),而若是要避開這種情況,可以改用其他 Join 的方式。
Inner Join
這是一般最常用的 join 方式,會過濾掉沒有符合資料的紀錄,以下是使用方式:
執行結果如下:
Left Outer Join
若是要留下 join 中沒有比對符合資料的紀錄,就必須改用 Left(Right) Outer Join 了,但 LINQ 中並沒有提供語法可以直接作到,因此要搭配 DefaultIfEmpty 方法來達到此效果:
執行結果如下:
Cross Join
這個就是有名的 Cartesian Product(卡氏積),會將 Join 兩方所有可能的組合通通列出,在 LINQ 中要達到這樣的效果,可以用下列的方式:
以下是程式執行結果: