摘要:動態LINQ (第一部分:使用LINQ動態查詢庫)
【原文位址】Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)
【原文發表日期】 Monday, January 07, 2008 11:02 PM
LINQ (語言整合查詢)是VS 2008 和 .NET 3.5中提供的一個新特性。LINQ使得資料查詢的概念成為.NET中的一等程式設計概念,允許你在你喜歡的程式設計語言中有效地表達查詢。
LINQ的一個好處是,它允許你使用 VB 和 C#. 編寫類別安全的查詢。這意味著,對你的程式碼,你會得到對LINQ查詢的編譯時檢查,以及完整的intellisense和重構支援:
類安全的查詢可用於大多數的場景,但也有些情形,你需要能在運行時動態構建查詢的彈性。例如,你也許要在應用中提供商業智慧的介面,允許業務分析員用戶使用下拉框在資料之上構造和表達他們自己的自訂查詢/檢視。
按慣例,這類動態查詢場景經常是通過把字串連接起來構建成動態SQL查詢的方式來處理的。最近有幾個人通過電郵問我該如何使用LINQ來處理這類場景。下面的文章內容將描述如何使用LINQ開發團隊提供的「動態查詢庫(Dynamic Query Library)」來動態地構建LINQ查詢。
下載LINQ動態查詢庫
VS 2008樣例下載網頁上包括了指向一個VB和C#樣例包的連結,該樣例包內含一個很酷的動態查詢LINQ輔助庫。該動態查詢庫(以及相關檔案)的直接連結如下:
- VB Dynamic Query Library (included in the \Language Samples\LINQ Samples\DynamicQuery directory)
- C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory)
VB和C#的DynamicQuery範例程式都包括了一個輔助庫的源碼實現,該輔助庫允許你使用接受字串參數(而不是類安全的語言運算子)的擴充方法來表示LINQ查詢。你可以把C#或VB的DynamicQuery庫的實現拷貝到你自己的專案中,然後在適當的地方根據用戶的輸入用它來動態地構建LINQ查詢。
動態查詢庫的簡單範例
你可以將DynamicQuery庫用於任何LINQ資料provider,這些provider包括LINQ to SQL, LINQ to Objects, LINQ to XML, LINQ to Entities, LINQ to SharePoint, LINQ to TerraServer等等。動態查詢庫不是使用語言級的運算子或類安全的 lambda 擴充方法來構建LINQ查詢,而是提供給你基於字串的擴充方法,你可以用這些方法來傳遞任何字串運算式。
例如,下面是用VB編寫的一個標準的類安全LINQ to SQL查詢,從 Northwind 資料庫中獲取資料,然後在一個ASP.NET GridView 控制項中做顯示:
使用LINQ DynamicQuery庫,我可以將上面的查詢運算式覆寫成:
注意,其中的條件式 where 子句和排序的 orderby 子句現在接受字串運算式,而不是程式碼運算式。因為它們是後期繫結字串,我可以動態地構建它們。例如,我可以提供介面給業務分析員用戶,允許他們自己構建查詢(包括任意的條件子句)。
動態查詢庫檔案
在上面的 VB 和 C# 動態查詢範例程式中還有一些HTML檔案,詳細描述了如何使用動態查詢庫中的擴充方法。如果你想要更深入地使用這個輔助庫的話,這些檔案絕對是值得一讀的:
下載和運行動態查詢庫的樣例
你可以下載和運行我編寫的 VB 和C# 基本範例程式,在其中我示範了在一個ASP.NET 網站專案中使用動態的LINQ庫對Northwind資料庫進行LINQ to SQL查詢:
你可以使用免費的Visual Web Developer 2008 Express版或者VS 2008打開運行這些專案。
構建動態LINQ查詢的其他方法
動態查詢庫簡單易用,在那些查詢是完全動態,你要提供介面給用戶,助他們構建這些動態查詢的場景下尤其有用。
在將來的文章裡,我將對構建動態LINQ查詢做深入探討,討論如何使用類安全的predicate方法來對你的程式碼進行結構化(《C# 3.0 In a Nutshell 》一書的作者Joseph 和 Ben Albahari,對此有個很精彩的文章,在 這裡)。
希望本文對你有所幫助,
Scott