偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

LINQ Lambda表達(dá)式淺談

開(kāi)發(fā) 后端
這里介紹LINQ Lambda表達(dá)式是許多標(biāo)準(zhǔn)查詢(xún)運(yùn)算符的基礎(chǔ),編譯器創(chuàng)建lambda表達(dá)式以捕獲基礎(chǔ)查詢(xún)方法(例如 Where、Select、Order By、Take While 以及其他方法)中定義的計(jì)算。

Linq有很多值得學(xué)習(xí)的地方,這里我們主要介紹LINQ Lambda表達(dá)式,包括介紹表達(dá)式目錄樹(shù)在LINQ中用于表示分配給類(lèi)型為Expression<TDelegate>的變量的LINQ Lambda表達(dá)式等方面。

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

LINQ Lambda表達(dá)式是許多標(biāo)準(zhǔn)查詢(xún)運(yùn)算符的基礎(chǔ),編譯器創(chuàng)建lambda表達(dá)式以捕獲基礎(chǔ)查詢(xún)方法(例如 Where、Select、Order By、Take While 以及其他方法)中定義的計(jì)算。表達(dá)式目錄樹(shù)用于針對(duì)數(shù)據(jù)源的結(jié)構(gòu)化查詢(xún),這些數(shù)據(jù)源實(shí)現(xiàn)IQueryable<T>。例如,LINQ to SQL 提供程序?qū)崿F(xiàn) IQueryable<T>接口,用于查詢(xún)關(guān)系數(shù)據(jù)存儲(chǔ)。C#和Visual Basic編譯器會(huì)針對(duì)此類(lèi)數(shù)據(jù)源的查詢(xún)編譯為代碼,該代碼在運(yùn)行時(shí)將生成一個(gè)表達(dá)式目錄樹(shù)。然后,查詢(xún)提供程序可以遍歷表達(dá)式目錄樹(shù)數(shù)據(jù)結(jié)構(gòu),并將其轉(zhuǎn)換為適合于數(shù)據(jù)源的查詢(xún)語(yǔ)言。

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

System.Linq.Expressions命名空間提供用于手動(dòng)生成表達(dá)式目錄樹(shù)的API。Expression類(lèi)包含創(chuàng)建特定類(lèi)型的表達(dá)式目錄樹(shù)節(jié)點(diǎn)的靜態(tài)工廠方法,例如,ParameterExpression(表示一個(gè)已命名的參數(shù)表達(dá)式)或 MethodCallExpression(表示一個(gè)方法調(diào)用)。編譯器生成的表達(dá)式目錄樹(shù)的根始終在類(lèi)型 Expression<TDelegate>的節(jié)點(diǎn)中,其中TDelegate是包含至多五個(gè)輸入?yún)?shù)的任何TDelegate委托;也就是說(shuō),其根節(jié)點(diǎn)是表示一個(gè)LINQ lambda表達(dá)式。

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

1.Select

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

  1. //依據(jù)IQueryable數(shù)據(jù)源構(gòu)造一個(gè)查詢(xún)  
  2. IQueryable<Customer> custs = db.Customers;  
  3. //組建一個(gè)表達(dá)式樹(shù)來(lái)創(chuàng)建一個(gè)參數(shù)  
  4. ParameterExpression param =   
  5. Expression.Parameter(typeof(Customer), "c");  
  6. //組建表達(dá)式樹(shù):c.ContactName  
  7. Expression selector = Expression.Property(param,  
  8. typeof(Customer).GetProperty("ContactName"));  
  9. Expression pred = Expression.Lambda(selector, param);  
  10. //組建表達(dá)式樹(shù):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á)式樹(shù)來(lái)生成動(dòng)態(tài)查詢(xún)  
  15. IQueryable<string> query = db.Customers.AsQueryable()  
  16. .Provider.CreateQuery<string>(expr);  
  17. //使用GetCommand方法獲取SQL語(yǔ)句  
  18. System.Data.Common.DbCommand cmd = db.GetCommand(query);  
  19. Console.WriteLine(cmd.CommandText); 

生成的SQL語(yǔ)句為:

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

2.Where

下面一個(gè)例子是“搭建”Where用法來(lái)動(dòng)態(tài)查詢(xú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.  
  11. Expression pred = Expression.Lambda(filter, param);  
  12. //Where(c=>c.City=="London")  
  13. Expression expr = Expression.Call(typeof(Queryable), "Where",  
  14. new Type[] { typeof(Customer) },   
  15. Expression.Constant(custs), pred);  
  16. //生成動(dòng)態(tài)查詢(xún)  
  17. IQueryable<Customer> query = db.Customers.AsQueryable()  
  18. .Provider.CreateQuery<Customer>(expr); 

生成的SQL語(yǔ)句為:

  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] 

【編輯推薦】

  1. Linq結(jié)果集形狀概述
  2. Linq存儲(chǔ)過(guò)程返回詳解
  3. Linq調(diào)用LoadProducts方法
  4. Linq使用數(shù)據(jù)表簡(jiǎn)單描述
  5. Linq對(duì)象引用簡(jiǎn)單介紹
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-09-15 15:18:00

Linq Lambda

2009-09-11 09:48:27

Linq Lambda

2009-09-15 17:30:00

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2009-09-17 10:40:22

Linq Lambda

2009-09-09 17:14:17

Linq lambda

2009-09-17 09:09:50

Lambda表達(dá)式Linq查詢(xún)

2009-08-27 09:57:50

C# Lambda表達(dá)

2009-04-29 09:05:59

Lambda抽象代表.NET

2009-09-11 12:32:33

LINQ表達(dá)式

2011-10-28 16:34:13

LINQ

2009-09-10 15:35:07

LINQ查詢(xún)表達(dá)式

2009-09-09 17:45:07

Linq表達(dá)式

2009-09-17 14:21:19

LINQ表達(dá)式

2022-12-05 09:31:51

接口lambda表達(dá)式

2009-09-07 17:18:33

LINQ查詢(xún)表達(dá)式

2009-09-11 09:53:16

Linq查詢(xún)表達(dá)式

2009-09-17 09:15:49

Linq表達(dá)式樹(shù)

2009-08-27 09:13:28

LINQ查詢(xún)表達(dá)式

2009-09-17 11:08:55

LINQ查詢(xún)表達(dá)式
點(diǎn)贊
收藏

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