2009年8月19日 星期三

[LINQ] 製作分頁功能 - 使用 skip & take

開發網頁程式時,分頁功能總是少不掉的.......

然而不使用 skip 與 take 來過濾資料,全部交給 GridView 控制項處理也是可以......

以下是使用範例:

xxx.aspx

xxx.aspx.cs


然而若是使用 skip & take,就可以僅取得部份資料,讓分頁相關的程式撰寫上更加有彈性,以下是使用方式:

xxx.aspx

xxx.aspx.cs

執行結果

2009年8月16日 星期日

[Silverlight 3.0] 如何讓消失的 ASP.NET Silverlight 控制項重新出現

昨天安裝了 Silverlight 3.0 的開發環境準備來學習一下 Silverlight

結果看書上有 ASP.NET Silverlight 控制項,但我的 VS 2010 就硬是不給我出現,解決方式有兩種:
  1. 安裝 Silverlight 2.0 SDK (沒錯......裝了 3.0 SDK 並不會有 2.0 SDK 有的東西....超怪....)

  2. 若不想安裝 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 ... 等等,以下介紹使用方式:


排序(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 的方式取得資料至少有兩樣優點:
  1. 查詢語法更加精簡

  2. 可在查詢語法中對群組命名,以便後續使用(例如:與 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 中要達到這樣的效果,可以用下列的方式:

以下是程式執行結果: