成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LINQ動態查詢的全面分析

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

LINQ動態查詢不是很容易就實現的,但是一旦能夠熟練運用了,那LINQ動態查詢能起很大作用,本文筆者就來向你介紹一下LINQ動態查詢。

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

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

在LINQ中,Lambda表達式是許多標準查詢運算符的基礎,編譯器創建lambda表達式以捕獲基礎查詢方法(例如 Where、Select、Order By、Take While 以及其他方法)中定義的計算。表達式目錄樹用于針對數據源的結構化查詢,這些數據源實現IQueryable

例如,LINQ to SQL 提供程序實現 IQueryable接口,用于查詢關系數據存儲。C#和Visual Basic編譯器會針對此類數據源的查詢編譯為代碼,該代碼在運行時將生成一個表達式目錄樹。然后,查詢提供程序可以遍歷表達式目錄樹數據結構,并將其轉換為適合于數據源的查詢語言。

表達式目錄樹在LINQ中用于表示分配給類型為Expression的變量的Lambda表達式。還可用于創建動態LINQ查詢。

System.Linq.Expressions命名空間提供用于手動生成表達式目錄樹的API。Expression類包含創建特定類型的表達式目錄樹節點的靜態工廠方法,例如,ParameterExpression(表示一個已命名的參數表達式)或 MethodCallExpression(表示一個方法調用)。

編譯器生成的表達式目錄樹的根始終在類型Expression的節點中,其中TDelegate是包含至多五個輸入參數的任何TDelegate委托;也就是說,其根節點是表示一個lambda表達式。

下面幾個例子描述如何使用表達式目錄樹來創建動態LINQ查詢。

1.LINQ動態查詢之Select

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

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

生成的SQL語句為:

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

2.LINQ動態查詢之Where

下面一個例子是“搭建”Where用法來動態查詢城市在倫敦的顧客。

  1. IQueryable<Customer> custs = db.Customers;  
  2. //創建一個參數c  
  3. ParameterExpression param =   
  4.     Expression.Parameter(typeof(Customer), "c");  
  5. //c.City=="London"  
  6. Expression left = Expression.Property(param,  
  7.     typeof(Customer).GetProperty("City"));  
  8. Expression right = Expression.Constant("London");  
  9. Expression filter = Expression.Equal(left, right);  
  10. Expression pred = Expression.Lambda(filter, param);  
  11. //Where(c=>c.City=="London")  
  12. Expression expr = Expression.Call(typeof(Queryable), "Where",  
  13.     new Type[] { typeof(Customer) },   
  14.     Expression.Constant(custs), pred);  
  15. //生成動態查詢  
  16. IQueryable<Customer> query = db.Customers.AsQueryable()  
  17.     .Provider.CreateQuery<Customer>(expr); 

生成的SQL語句為:

  1. SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName],   
  2. [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region],   
  3. [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]  
  4. FROM [dbo].[Customers] AS [t0] WHERE [t0].[City] = @p0  
  5. -- @p0: Input NVarChar (Size = 6Prec = 0Scale = 0) [London]3.OrderBy 

本例既實現排序功能又實現了過濾功能。

  1. IQueryable<Customer> custs = db.Customers;  
  2. //創建一個參數c  
  3. ParameterExpression param =  
  4.    Expression.Parameter(typeof(Customer), "c");  
  5. //c.City=="London"  
  6. Expression left = Expression.Property(param,  
  7.     typeof(Customer).GetProperty("City"));  
  8. Expression right = Expression.Constant("London");  
  9. Expression filter = Expression.Equal(left, right);  
  10. Expression pred = Expression.Lambda(filter, param);  
  11. //Where(c=>c.City=="London")  
  12. MethodCallExpression whereCallExpression = Expression.Call(  
  13.     typeof(Queryable), "Where",  
  14.     new Type[] { typeof(Customer) },  
  15.     Expression.Constant(custs), pred);  
  16. //OrderBy(ContactName => ContactName)  
  17. MethodCallExpression orderByCallExpression = Expression.Call(  
  18.     typeof(Queryable), "OrderBy",  
  19.     new Type[] { typeof(Customer), typeof(string) },   
  20.     whereCallExpression,  
  21.     Expression.Lambda(Expression.Property  
  22.     (param, "ContactName"), param));  
  23. //生成動態查詢  
  24. IQueryable<Customer> query = db.Customers.AsQueryable()  
  25.     .Provider.CreateQuery<Customer>(orderByCallExpression); 

生成的SQL語句為:

  1. SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName],   
  2. [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region],  
  3. [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]  
  4. FROM [dbo].[Customers] AS [t0] WHERE [t0].[City] = @p0  
  5. ORDER BY [t0].[ContactName]  
  6. -- @p0: Input NVarChar (Size = 6Prec = 0Scale = 0) [London]4.Union  

下面的例子使用表達式樹LINQ動態查詢顧客和雇員同在的城市。

  1. //e.City  
  2. IQueryable<Customer> custs = db.Customers;            
  3. ParameterExpression param1 =   
  4. Expression.Parameter(typeof(Customer), "e");  
  5. Expression left1 = Expression.Property(param1,   
  6.     typeof(Customer).GetProperty("City"));  
  7. Expression pred1 = Expression.Lambda(left1, param1);  
  8. //c.City  
  9. IQueryable<Employee> employees = db.Employees;  
  10. ParameterExpression param2 =   
  11. Expression.Parameter(typeof(Employee), "c");  
  12. Expression left2 = Expression.Property(param2,   
  13.     typeof(Employee).GetProperty("City"));  
  14. Expression pred2 = Expression.Lambda(left2, param2);  
  15. //Select(e=>e.City)  
  16. Expression expr1 = Expression.Call(typeof(Queryable), "Select",   
  17.     new Type[] { typeof(Customer), typeof(string) },   
  18.     Expression.Constant(custs), pred1);  
  19. //Select(c=>c.City)  
  20. Expression expr2 = Expression.Call(typeof(Queryable), "Select",   
  21.     new Type[] { typeof(Employee), typeof(string) },   
  22.     Expression.Constant(employees), pred2);  
  23. //生成動態查詢  
  24. IQueryable<string> q1 = db.Customers.AsQueryable()  
  25.     .Provider.CreateQuery<string>(expr1);  
  26. IQueryable<string> q2 = db.Employees.AsQueryable()  
  27.     .Provider.CreateQuery<string>(expr2);  
  28. //并集  
  29. var q3 = q1.Union(q2); 

生成的SQL語句為:

  1. SELECT [t2].[City]  
  2. FROM (  
  3.     SELECT [t0].[City] FROM [dbo].[Customers] AS [t0]  
  4.     UNION  
  5.     SELECT [t1].[City] FROM [dbo].[Employees] AS [t1]  
  6.     ) AS [t2]ID標識 

在前面這一點沒有說到,在這里作為高級特性單獨說下ID標識。

這個例子說明我們存儲一條新的記錄時候,ContactID作為主鍵標識,系統自動分配,標識種子為1,所以每次自動加一。

  1. //ContactID是主鍵ID,插入一條數據,系統自動分配ID  
  2. Contact con = new Contact()  
  3. {  
  4.     CompanyName = "New Era",  
  5.     Phone = "(123)-456-7890" 
  6. };  
  7. db.Contacts.InsertOnSubmit(con);  
  8. db.SubmitChanges();  

以上就是對LINQ動態查詢的詳細闡述。

【編輯推薦】

  1. 深入淺出 LINQ表達式
  2. LINQ基礎學習之LINQ to XML
  3. 學習心得LINQ to XML
  4. 淺析LINQ開發技術之LINQ to XML
  5. 詳細闡述linq動態排序
責任編輯:阡陌 來源: 博客園
相關推薦

2009-09-16 10:48:32

LINQ查詢操作

2009-09-16 10:38:43

LINQ查詢

2009-09-17 13:15:20

LINQ查詢

2009-09-16 17:41:56

Linq延時執行

2009-09-14 18:53:27

LINQ查詢

2009-09-14 19:14:51

LINQ動態查詢

2009-09-15 10:46:04

LINQ to SQL

2009-09-14 10:09:26

LINQ查詢結果

2009-09-15 09:19:22

linq動態條件

2009-09-17 16:46:34

Linq to sql

2009-09-18 15:15:12

LINQ to SQL

2009-09-15 10:16:01

LINQ動態查詢

2009-09-17 09:44:54

Linq Lambda

2009-09-17 16:20:43

Linq to sql

2009-09-15 09:45:23

Linq動態條件

2009-09-16 15:41:45

LINQ查詢XML文檔

2009-09-18 16:46:15

LINQ查詢句法

2009-09-15 14:58:26

Linq查詢本質

2009-09-17 08:47:00

Linq查詢

2009-09-18 16:20:36

LINQ基礎
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕乱码一区二区三区 | 羞羞视频免费观看 | 国产日韩精品一区 | 日韩中文在线 | 99福利视频导航 | 一级毛片色一级 | 九九视频在线观看 | 久热中文字幕 | 亚洲国产第一页 | 日韩三级电影在线看 | 日韩一级二级片 | 精品中文字幕在线 | 国产精品免费一区二区三区四区 | 欧美在线观看一区 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产成人精品一区 | 色精品视频 | 日韩电影在线 | 色吧久久 | 99精品视频一区二区三区 | 欧美精品一区二区蜜桃 | 一级黄色片免费在线观看 | 亚洲自拍一区在线观看 | 蜜桃在线一区二区三区 | 黄色在线免费观看 | 久久成人在线视频 | 成人欧美一区二区三区在线观看 | 午夜激情免费视频 | 羞羞的视频在线看 | 日韩毛片| 精品欧美一区二区精品久久久 | 一区二区在线 | 成人欧美一区二区三区黑人孕妇 | 日韩视频专区 | 欧美久久视频 | 亚洲一区网站 | 欧美一级免费 | a视频在线观看 | 偷牌自拍| 99久久久无码国产精品 | 波多野结衣中文视频 |