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

C# Lambda Expression使用實(shí)例解析

開(kāi)發(fā) 后端
C# Lambda Expression的使用主要是我們LINQ to SQL的實(shí)際應(yīng)用中處理數(shù)據(jù)的時(shí)候會(huì)碰到,那么C# Lambda Expression的出現(xiàn)會(huì)給我們帶來(lái)什么好處呢?那么本文就向你介紹詳細(xì)的內(nèi)容。

我們?cè)贚INQ to SQL的實(shí)際開(kāi)發(fā)應(yīng)用中C# Lambda Expression的使用是什么情況呢?尤其是ORM框架使用時(shí)會(huì)碰到在刪除數(shù)據(jù)方面的一些問(wèn)題,就是使用特定條件無(wú)法批量刪除數(shù)據(jù)。那么如何解決這種問(wèn)題呢?那么這里向你提供了一點(diǎn)思路,希望對(duì)你有所幫助。

我們處理一些刪除操作,會(huì)選擇寫(xiě)SQL語(yǔ)句或者執(zhí)行存儲(chǔ)過(guò)程,例如:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.ExecuteCommand(  
  3. "DELETE FROM Item WHERE [CreateTime] < {0}",   
  4. DateTime.UtcNow.AddMonths(-1)); 

C# Lambda Expression的出現(xiàn)

在程序里出現(xiàn)直接的SQL語(yǔ)句是一件很丑陋的事情。在我看來(lái),數(shù)據(jù)庫(kù)操作應(yīng)該被封裝起來(lái),而對(duì)于應(yīng)用層的開(kāi)發(fā)人員來(lái)說(shuō),眼中應(yīng)該只有對(duì)象——退一步的話也可向數(shù)據(jù)庫(kù)發(fā)送指令(就是使用存儲(chǔ)過(guò)程)。當(dāng)然,這是理想狀態(tài),值得追求,但不可強(qiáng)求。幸運(yùn)的是C# 3.0所擁有的強(qiáng)大特性足以讓我們對(duì)LINQ to SQL的功能進(jìn)行擴(kuò)展。為了更好地進(jìn)行項(xiàng)目開(kāi)發(fā),以及周五的一次技術(shù)交流,我為L(zhǎng)INQ to SQL擴(kuò)展了批量刪除功能。當(dāng)項(xiàng)目中引用了這個(gè)擴(kuò)展之后,我們就可以使用如下的代碼來(lái)實(shí)現(xiàn)上面的功能了:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.Items.Delete(item =>   
  3. item.CreateTime < DateTime.UtcNow.AddMonths(-1)); 

當(dāng)然,擴(kuò)展還支持更復(fù)雜的刪除條件,例如:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.Items.Delete(item =>  
  3. item.CreateTime < DateTime.UtcNow.AddMonths(-1) ||   
  4. item.ViewCount < item.CommentCount && item.UserName != "jeffz");  

之前我對(duì)于LINQ to SQL的擴(kuò)展大都基于DataContext,不過(guò)很明顯,這次的擴(kuò)展是基于Table<T>的??偟膩?lái)說(shuō),這個(gè)擴(kuò)展比我想象中要簡(jiǎn)單不少。針對(duì)LINQ的擴(kuò)展最麻煩的地方就在于解析表達(dá)式樹(shù)(Expression Tree),而這個(gè)擴(kuò)展關(guān)鍵的就是二元表達(dá)式(BinaryExpression),除了這點(diǎn)就沒(méi)有太大問(wèn)題了——當(dāng)然,這也是因?yàn)槲曳艞壛藢?duì)于復(fù)雜表達(dá)式樹(shù)的解析,例如現(xiàn)在就不支持“item.Introduction.Length < 10”這種條件,而對(duì)于更完整的解析方式來(lái)說(shuō),應(yīng)該將其轉(zhuǎn)化為T(mén)-SQL中的LEN函數(shù)。

C# Lambda Expression的使用:

這個(gè)擴(kuò)展的關(guān)鍵在于根據(jù)表達(dá)式樹(shù)生成Where Condition,我使用三個(gè)步驟完成這個(gè)擴(kuò)展,大家可以關(guān)注代碼里的相關(guān)實(shí)現(xiàn)(如果需要的話我也可以在以后進(jìn)行說(shuō)明):

◆使用PartialEvaluator將表達(dá)式中的常量直接計(jì)算出來(lái)(例如“3 * 3”表達(dá)式將被替換為“9”),同時(shí)也會(huì)將一些存儲(chǔ)在變量中的值使用常量進(jìn)行替換。

◆使用ConditionBuilder將表達(dá)式中的常量收集起來(lái),并生成帶參數(shù)的Condition表達(dá)式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。

◆使用DataContext.ExecuteCommand方法執(zhí)行完整的SQL語(yǔ)句。

有了批量刪除的功能,那么還缺點(diǎn)什么呢?那自然就是批量更新的功能了。批量更新的功能比刪除略為復(fù)雜一些,我正在開(kāi)發(fā)之中。在有了這個(gè)擴(kuò)展之后,我們就可以使用如下的方法進(jìn)行批量更新了:

  1. ItemDataContext db = new ItemDataContext();  
  2. db.Items.Update(  
  3. item => new Item  
  4. {  
  5. Introduction = item.Title + "Hello World",  
  6. ViewCount = item.ViewCount + 1,  
  7. }, // 更新方式  
  8. item => item.CommentCount > 100 /* 更新條件 */); 

原文來(lái)自:http://www.cnblogs.com/zhanglxun/archive/2009/04/21/1440351.html

C# Lambda Expression的使用實(shí)例就向你介紹到這里,對(duì)于C# Lambda Expression的使用講解希望對(duì)你的開(kāi)發(fā)有所幫助。

【編輯推薦】

  1. LINQ刪除記錄的操作實(shí)現(xiàn)
  2. 實(shí)現(xiàn)LINQ刪除數(shù)據(jù)的巧妙方法
  3. 詳解實(shí)現(xiàn)LINQ to SQL刪除行
  4. C# Lambda Expression概念淺析
  5. 詳解C# Lambda表達(dá)式的動(dòng)態(tài)生成
責(zé)任編輯:仲衡 來(lái)源: 博客園
相關(guān)推薦

2009-09-14 13:44:14

Lambda ExprC# Lambda

2009-09-09 14:40:15

C# XML解析

2009-08-26 12:14:44

C#打印設(shè)置

2009-09-07 06:31:32

C#窗體移動(dòng)

2009-08-19 16:09:15

C#操作Access

2009-08-31 18:17:32

C#接口編程

2009-09-09 13:57:28

C# XML解析

2009-08-18 10:47:40

C#枚舉類型

2009-09-01 18:32:32

C#動(dòng)態(tài)數(shù)組

2009-09-01 13:51:51

C#創(chuàng)建Word文檔

2009-09-03 09:16:35

C#遞歸函數(shù)

2009-08-31 17:30:10

C#接口的作用

2009-09-04 13:37:44

C#貨幣格式

2009-09-03 15:43:21

C#時(shí)間計(jì)算

2009-08-31 17:16:12

C#實(shí)現(xiàn)接口

2009-08-28 12:31:06

C#靜態(tài)方法

2009-08-27 17:40:21

C#接口的作用

2024-12-02 00:53:45

IDisposabl工具接口

2009-08-27 15:17:18

C# interfacinterface使用

2011-05-20 17:50:45

C#
點(diǎn)贊
收藏

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