LINQ高級特性簡單介紹
本文介紹LINQ高級特性,其包括大家都關心的動態查詢的用法和使用表達式樹依據 IQueryable 數據源構造一個動態查詢。
LINQ高級特性之動態查詢
有這樣一個場景:應用程序可能會提供一個用戶界面,用戶可以使用該用戶界面指定一個或多個謂詞來篩選數據。這種情況在編譯時不知道查詢的細節,動態查詢將十分有用。
在LINQ中,Lambda 表達式是許多標準查詢運算符的基礎,編譯器創建lambda表達式以捕獲基礎查詢方法(例如 Where、Select、Order By、Take While 以及其他方法)中定義的計算。表達式目錄樹用于針對數據源的結構化查詢,這些數據源實現IQueryable<T>。例如,LINQ to SQL 提供程序實現 IQueryable<T>接口,用于查詢關系數據存儲。C#和Visual Basic編譯器會針對此類數據源的查詢編譯為代碼,該代碼在運行時將生成一個表達式目錄樹。然后,查詢提供程序可以遍歷表達式目錄樹數據結構,并將其轉換為適合于數據源的查詢語言。
表達式目錄樹在LINQ中用于表示分配給類型為Expression<TDelegate>的變量的Lambda表達式。還可用于創建動態LINQ查詢。
System.Linq.Expressions 命名空間提供用于手動生成表達式目錄樹的API。Expression類包含創建特定類型的表達式目錄樹節點的靜態工廠方法,例如,ParameterExpression(表示一個已命名的參數表達式)或 MethodCallExpression(表示一個方法調用)。編譯器生成的表達式目錄樹的根始終在類型 Expression<TDelegate>的節點中,其中TDelegate是包含至多五個輸入參數的任何TDelegate委托;也就是說,其根節點是表示一個lambda表達式。
下面幾個例子描述如何使用表達式目錄樹來創建動態LINQ查詢。
LINQ高級特性之Select
下面例子說明如何使用表達式樹依據 IQueryable 數據源構造一個動態查詢,查詢出每個顧客的ContactName,并用GetCommand方法獲取其生成SQL語句。
- //依據IQueryable數據源構造一個查詢
- IQueryable<Customer> custs = db.Customers;
- //組建一個表達式樹來創建一個參數
- ParameterExpressionparam =Expression.Parameter(typeof(Customer),"c");
- //組建表達式樹
- c.ContactNameExpressionselector =Expression.Property(param,typeof(Customer).
GetProperty("ContactName"));- ExpressionExpressionpred =Expression.Lambda(selector, param);
- //組建表達式樹:Select(c=>c.ContactName)ExpressionExpressionexpr =Expression.Call
(typeof(Queryable),"Select",newType[] {typeof(Customer),typeof(string) },
Expression.Constant(custs), pred);- //使用表達式樹來生成動態查詢IQueryable<string> query = db.Customers.AsQueryable()
- .Provider.CreateQuery<string>(expr);
- //使用GetCommand方法獲取SQL語句
- System.Data.Common.DbCommandcmd = db.GetCommand(query);
- Console.WriteLine(cmd.CommandText);
【編輯推薦】