自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LINQ動(dòng)態(tài)查詢的全面分析

開發(fā) 后端
應(yīng)用程序可能會(huì)提供一個(gè)用戶界面,用戶可以使用該用戶界面指定一個(gè)或多個(gè)謂詞來篩選數(shù)據(jù)。這種情況在編譯時(shí)不知道查詢的細(xì)節(jié),LINQ動(dòng)態(tài)查詢將十分有用。

LINQ動(dòng)態(tài)查詢不是很容易就實(shí)現(xiàn)的,但是一旦能夠熟練運(yùn)用了,那LINQ動(dòng)態(tài)查詢能起很大作用,本文筆者就來向你介紹一下LINQ動(dòng)態(tài)查詢。

本文介紹LINQ的高級(jí)特性,其包括大家都關(guān)心的LINQ動(dòng)態(tài)查詢的用法,另外簡(jiǎn)單提下ID標(biāo)識(shí)這個(gè)知識(shí)。

LINQ動(dòng)態(tài)查詢有這樣一個(gè)場(chǎng)景:應(yīng)用程序可能會(huì)提供一個(gè)用戶界面,用戶可以使用該用戶界面指定一個(gè)或多個(gè)謂詞來篩選數(shù)據(jù)。這種情況在編譯時(shí)不知道查詢的細(xì)節(jié),LINQ動(dòng)態(tài)查詢將十分有用。

在LINQ中,Lambda表達(dá)式是許多標(biāo)準(zhǔn)查詢運(yùn)算符的基礎(chǔ),編譯器創(chuàng)建lambda表達(dá)式以捕獲基礎(chǔ)查詢方法(例如 Where、Select、Order By、Take While 以及其他方法)中定義的計(jì)算。表達(dá)式目錄樹用于針對(duì)數(shù)據(jù)源的結(jié)構(gòu)化查詢,這些數(shù)據(jù)源實(shí)現(xiàn)IQueryable

例如,LINQ to SQL 提供程序?qū)崿F(xiàn) IQueryable接口,用于查詢關(guān)系數(shù)據(jù)存儲(chǔ)。C#和Visual Basic編譯器會(huì)針對(duì)此類數(shù)據(jù)源的查詢編譯為代碼,該代碼在運(yùn)行時(shí)將生成一個(gè)表達(dá)式目錄樹。然后,查詢提供程序可以遍歷表達(dá)式目錄樹數(shù)據(jù)結(jié)構(gòu),并將其轉(zhuǎn)換為適合于數(shù)據(jù)源的查詢語言。

表達(dá)式目錄樹在LINQ中用于表示分配給類型為Expression的變量的Lambda表達(dá)式。還可用于創(chuàng)建動(dòng)態(tài)LINQ查詢。

System.Linq.Expressions命名空間提供用于手動(dòng)生成表達(dá)式目錄樹的API。Expression類包含創(chuàng)建特定類型的表達(dá)式目錄樹節(jié)點(diǎn)的靜態(tài)工廠方法,例如,ParameterExpression(表示一個(gè)已命名的參數(shù)表達(dá)式)或 MethodCallExpression(表示一個(gè)方法調(diào)用)。

編譯器生成的表達(dá)式目錄樹的根始終在類型Expression的節(jié)點(diǎn)中,其中TDelegate是包含至多五個(gè)輸入?yún)?shù)的任何TDelegate委托;也就是說,其根節(jié)點(diǎn)是表示一個(gè)lambda表達(dá)式。

下面幾個(gè)例子描述如何使用表達(dá)式目錄樹來創(chuàng)建動(dòng)態(tài)LINQ查詢。

1.LINQ動(dòng)態(tài)查詢之Select

下面例子說明如何使用表達(dá)式樹依據(jù) IQueryable 數(shù)據(jù)源構(gòu)造一個(gè)動(dòng)態(tài)查詢,查詢出每個(gè)顧客的ContactName,并用GetCommand方法獲取其生成SQL語句。

  1. //依據(jù)IQueryable數(shù)據(jù)源構(gòu)造一個(gè)查詢  
  2. IQueryable<Customer> custs = db.Customers;  
  3. //組建一個(gè)表達(dá)式樹來創(chuàng)建一個(gè)參數(shù)  
  4. ParameterExpression param =   
  5.     Expression.Parameter(typeof(Customer), "c");  
  6. //組建表達(dá)式樹:c.ContactName  
  7. Expression selector = Expression.Property(param,  
  8.     typeof(Customer).GetProperty("ContactName"));  
  9. Expression pred = Expression.Lambda(selector, param);  
  10. //組建表達(dá)式樹: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. //使用表達(dá)式樹來生成動(dòng)態(tài)查詢  
  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動(dòng)態(tài)查詢之Where

下面一個(gè)例子是“搭建”Where用法來動(dòng)態(tài)查詢城市在倫敦的顧客。

  1. IQueryable<Customer> custs = db.Customers;  
  2. //創(chuàng)建一個(gè)參數(shù)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. //生成動(dòng)態(tài)查詢  
  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 

本例既實(shí)現(xiàn)排序功能又實(shí)現(xiàn)了過濾功能。

  1. IQueryable<Customer> custs = db.Customers;  
  2. //創(chuàng)建一個(gè)參數(shù)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. //生成動(dòng)態(tài)查詢  
  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  

下面的例子使用表達(dá)式樹LINQ動(dòng)態(tài)查詢顧客和雇員同在的城市。

  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. //生成動(dòng)態(tài)查詢  
  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標(biāo)識(shí) 

在前面這一點(diǎn)沒有說到,在這里作為高級(jí)特性單獨(dú)說下ID標(biāo)識(shí)。

這個(gè)例子說明我們存儲(chǔ)一條新的記錄時(shí)候,ContactID作為主鍵標(biāo)識(shí),系統(tǒng)自動(dòng)分配,標(biāo)識(shí)種子為1,所以每次自動(dòng)加一。

  1. //ContactID是主鍵ID,插入一條數(shù)據(jù),系統(tǒng)自動(dòng)分配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();  

以上就是對(duì)LINQ動(dòng)態(tài)查詢的詳細(xì)闡述。

【編輯推薦】

  1. 深入淺出 LINQ表達(dá)式
  2. LINQ基礎(chǔ)學(xué)習(xí)之LINQ to XML
  3. 學(xué)習(xí)心得LINQ to XML
  4. 淺析LINQ開發(fā)技術(shù)之LINQ to XML
  5. 詳細(xì)闡述linq動(dòng)態(tài)排序
責(zé)任編輯:阡陌 來源: 博客園
相關(guān)推薦

2009-09-16 10:48:32

LINQ查詢操作

2009-09-17 13:15:20

LINQ查詢

2009-09-16 10:38:43

LINQ查詢

2009-09-16 17:41:56

Linq延時(shí)執(zhí)行

2009-09-14 19:14:51

LINQ動(dòng)態(tài)查詢

2009-09-14 18:53:27

LINQ查詢

2009-09-14 10:09:26

LINQ查詢結(jié)果

2009-09-15 10:16:01

LINQ動(dòng)態(tài)查詢

2009-09-17 16:46:34

Linq to sql

2009-09-18 15:15:12

LINQ to SQL

2009-09-15 09:19:22

linq動(dòng)態(tài)條件

2009-09-15 10:46:04

LINQ to SQL

2009-09-15 09:45:23

Linq動(dòng)態(tài)條件

2009-09-15 14:58:26

Linq查詢本質(zhì)

2009-09-17 16:20:43

Linq to sql

2009-09-17 09:44:54

Linq Lambda

2009-09-16 15:41:45

LINQ查詢XML文檔

2009-09-18 16:46:15

LINQ查詢句法

2009-09-17 08:47:00

Linq查詢

2009-09-14 17:03:32

LINQ模糊查詢
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)