程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> LINQ體驗(17)——LINQ to SQL語句之動態查詢

LINQ體驗(17)——LINQ to SQL語句之動態查詢

編輯:關於ASP.NET

高級特性

本文介紹LINQ的高級特性,其包括大家都關心的動態查詢的用法 ,另外簡單提下ID標識這個知識。

動態查詢

有這樣一個場景:應用程 序可能會提供一個用戶界面,用戶可以使用該用戶界面指定一個或多個謂詞來篩 選數據。這種情況在編譯時不知道查詢的細節,動態查詢將十分有用。

在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查詢。

1.Select

下面例子說明如何使用表達式樹依據 IQueryable 數據源構 造一個動態查詢,查詢出每個顧客的ContactName,並用GetCommand方法獲取其 生成SQL語句。

//依據IQueryable數據源構造一個查詢
IQueryable<Customer> custs = db.Customers;
//組建一個表達 式樹來創建一個參數
ParameterExpression param =
   Expression.Parameter(typeof(Customer), "c");
//組建表達 式樹:c.ContactName
Expression selector = Expression.Property (param,
  typeof(Customer).GetProperty ("ContactName"));
Expression pred = Expression.Lambda (selector, param);
//組建表達式樹:Select(c=>c.ContactName)
Expression expr = Expression.Call(typeof(Queryable), "Select",
  new Type[] { typeof(Customer), typeof (string) },
  Expression.Constant(custs), pred);
//使用表 達式樹來生成動態查詢
IQueryable<string> query = db.Customers.AsQueryable()
   .Provider.CreateQuery<string>(expr);
//使用GetCommand方法 獲取SQL語句
System.Data.Common.DbCommand cmd = db.GetCommand (query);
Console.WriteLine(cmd.CommandText);

生成的 SQL語句為:

SELECT [t0].[ContactName] FROM [dbo]. [Customers] AS [t0]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved