日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解C#Lambda表達式的動態(tài)生成

對于C# Lambda的理解我們在之前的文章中已經(jīng)講述過了,那么作為Delegate的進化使用,為了讓代碼簡潔和優(yōu)雅的呈現(xiàn),C# Lambda表達式的使用功不可滅,那么依托外部條件如何動態(tài)構(gòu)建C# Lambda表達式呢。下面讓我們來具體的看看實施。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、趙縣ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的趙縣網(wǎng)站制作公司

或許你會奇怪這個需求是如何產(chǎn)生的…… 首先,Lambda 在 DLinq 中承擔了以往 T-SQL 的部分角色;其次,在數(shù)據(jù)庫設(shè)計中,我們往往需要依據(jù)外部未知的動態(tài)條件組合來查詢數(shù)據(jù)。而問題在于作為一種靜態(tài)語言,我們顯然無法用動態(tài)語法或者拼接字符串的方法來創(chuàng)建一個Delegate/Lambda,那么如何達到類似的目的呢?CodeDom?Emit?或許最佳的選擇是 System.Linq.Expressions.Expression。

1、首先我們了解一個簡單C# Lambda表達式的構(gòu)成。

 
 
 
  1. i => i > 5 

在這個表達式中,"i" 被稱為 Parameter,"i > 5" 是 Body。我們可以對 Body 進行更進一步的分解,那么 "i > 5" 分別包含參數(shù)(i)、操作符(>)以及一個常數(shù)(5)。所有這些通過特定順序的組合,從而構(gòu)建一個完整的 Lambda 表達式。

2、我們通過一些例子,來學(xué)習(xí)如何動態(tài)構(gòu)建C# Lambda表達式。

動態(tài)構(gòu)建C# Lambda表達式例子1

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. //var r = ints.Where(i => i > 5);   
  4. // 要實現(xiàn)的表達式  
  5.  
  6. // 創(chuàng)建參數(shù) i  
  7. var parameter =   
  8. Expression.Parameter(typeof(int), "i");  
  9.  
  10. // 創(chuàng)建常量5  
  11. var constant =   
  12. Expression.Constant(5);  
  13.  
  14. // 創(chuàng)建比較表達式 i > 5  
  15. var bin =   
  16. Expression.GreaterThan(parameter, constant);  
  17.  
  18. // 獲取Lambda表達式  
  19. var lambda =   
  20. Expression.Lambda>(bin, parameter);  
  21.  
  22. // 通過 Compile 方法獲取 Delegate  
  23. var _r = ints.Where(lambda.Compile());  

在代碼中設(shè)置斷點,我們可以看到調(diào)試器中顯示的表達式信息。

圖1

.NET FX 3.5 中為 Lambda 新增了一些委托類型。

(1) 用于處理無返回數(shù)據(jù)的 Action。

 
 
 
  1. public delegate void   
  2. Action()  
  3. public delegate void   
  4. Action (T arg)  
  5. public delegate void   
  6. Action (T1 arg1, T2 arg2)  
  7. public delegate void   
  8. Action   
  9. (T1 arg1, T2 arg2, T3 arg3)  
  10. public delegate void   
  11. Action   
  12. (T1 arg1, T2 arg2, T3 arg3, T4 arg4) 

(2) 用于處理帶返回數(shù)據(jù)的 Func。

 
 
 
  1. public delegate TResult   
  2. Func ()  
  3. public delegate TResult  
  4. Func (T arg)  
  5. public delegate TResult   
  6. Func   
  7. (T1 arg1, T2 arg2)  
  8. public delegate TResult   
  9. Func   
  10. (T1 arg1, T2 arg2, T3 arg3)  
  11. public delegate TResult   
  12. Func   
  13. (T1 arg1, T2 arg2, T3 arg3, T4 arg4) 

我們還可以進行更復(fù)雜的組合。

動態(tài)構(gòu)建C# Lambda表達式例子2

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. // var r =   
  4. ints.Where(i => i > 5 && i <= 7);  
  5.  // 要實現(xiàn)的表達式  
  6.  
  7. // 創(chuàng)建參數(shù) i  
  8. var parameter =   
  9. Expression.Parameter(typeof(int), "i");  
  10.  
  11. // 創(chuàng)建表達式 i > 5   
  12. var con1 =   
  13. Expression.Constant(5);  
  14. var bin1 =   
  15. Expression.GreaterThan(parameter, con1);  
  16.  
  17. // 創(chuàng)建表達式 i <= 7  
  18. var con2 =   
  19. Expression.Constant(7);  
  20. var bin2 =   
  21. Expression.LessThanOrEqual(parameter, con2);  
  22.  
  23. // 組合兩個表達式  
  24. var body =   
  25. Expression.And(bin1, bin2);  
  26.  
  27. // 獲取 Lambda 表達式  
  28. var lambda =   
  29. Expression.Lambda>(body, parameter);  
  30.  
  31. var _r = ints.Where(lambda.Compile());  

在例子2中,我們對復(fù)雜的表達式進行了分解,并使用 And 完成多個表達式的組裝,由此我們可以創(chuàng)建更加復(fù)雜的邏輯組合,比如例子3。#p#

動態(tài)構(gòu)建C# Lambda表達式例子3

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. // var r =   
  4. ints.Where(i => (i > 5 && i <= 7) || (i == 3));   
  5. // 要實現(xiàn)的表達式  
  6.  
  7. // 創(chuàng)建參數(shù) i  
  8. var parameter =   
  9. Expression.Parameter(typeof(int), "i");  
  10.  
  11. // 創(chuàng)建表達式 i > 5  
  12. var con1 =   
  13. Expression.Constant(5);  
  14. var bin1 =   
  15. Expression.GreaterThan(parameter, con1);  
  16.  
  17. // 創(chuàng)建表達式 i < 7  
  18. var con2 =   
  19. Expression.Constant(7);  
  20. var bin2 =   
  21. Expression.LessThanOrEqual(parameter, con2);  
  22.  
  23. // 創(chuàng)建表達式 i == 3  
  24. var con3 =   
  25. Expression.Constant(3);  
  26. var bin3 =   
  27. Expression.Equal(parameter, con3);  
  28.  
  29. // 組合 i > 5 && i <= 7  
  30. var body =   
  31. Expression.And(bin1, bin2);  
  32.  
  33. // 組合 ( i > 5 && i <= 7) OR (i == 3)  
  34. body = Expression.Or(body, bin3);  
  35.  
  36. var lambda =   
  37. Expression.Lambda>  
  38. (body, parameter);  
  39. var _r = ints.Where(lambda.Compile());  

我們繼續(xù)看幾個常見的例子。

動態(tài)構(gòu)建C# Lambda表達式例子4

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. //var r = ints.Select(i => i % 2 == 0 ? i : 0);   
  4. // 要實現(xiàn)的表達式  
  5.  
  6. // 創(chuàng)建參數(shù) i  
  7. var parameter =   
  8. Expression.Parameter(typeof(int), "i");  
  9.  
  10. // 創(chuàng)建表達式 i % 2  
  11. var con1 =   
  12. Expression.Constant(2);  
  13. var bin1 =   
  14. Expression.Modulo(parameter, con1);  
  15.  
  16. // 創(chuàng)建表達式 (i % 2) == 0  
  17. var con2 =   
  18. Expression.Constant(0);  
  19. var bin2 =   
  20. Expression.Equal(bin1, con2);  
  21.  
  22. // 創(chuàng)建表達式 IIF(((i % 2) = 0), i, 0)  
  23. var bin3 =   
  24. Expression.Condition  
  25. (bin2, parameter, Expression.Constant(0));  
  26.  
  27. var lambda =   
  28. Expression.Lambda>(bin3, parameter);  
  29. var _r = ints.Select(lambda.Compile());  

動態(tài)構(gòu)建C# Lambda表達式例子5

 
 
 
  1. var ints =   
  2. new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  3. // Array.ForEach(ints, i => Console.WriteLine(i));  
  4.  // 要實現(xiàn)的表達式  
  5.  
  6. // 創(chuàng)建參數(shù)i  
  7. var parameter =   
  8. Expression.Parameter(typeof(int), "i");  
  9.  
  10. // 獲取 Console.WriteLine MethodInfo  
  11. MethodInfo method =   
  12. typeof(Console).GetMethod(  
  13. "WriteLine", new Type[] { typeof(int) });  
  14.  
  15. // 創(chuàng)建表達式   
  16. var call = Expression.Call(method, parameter);  
  17.  
  18. var lambda =   
  19. Expression.Lambda>(call, parameter);  
  20. Array.ForEach(  
  21. ints, lambda.Compile());  

是該花點時間去好好研究一下 System.Linq.Expressions Namespace 了……

動態(tài)構(gòu)建C# Lambda表達式的基本內(nèi)容就向你介紹到這里,希望那個對你了解和掌握使用動態(tài)構(gòu)建C# Lambda表達式有所幫助。

【編輯推薦】

  1. LINQ to SQL刪除實現(xiàn)體會小結(jié)
  2. LINQ刪除記錄的操作實現(xiàn)
  3. 實現(xiàn)LINQ刪除數(shù)據(jù)的巧妙方法
  4. 詳解實現(xiàn)LINQ to SQL刪除行
  5. C# Lambda Expression概念淺析

分享文章:詳解C#Lambda表達式的動態(tài)生成
文章分享:http://m.5511xx.com/article/dhoieoo.html