動態產生C# Lambda運算式

來源:互聯網
上載者:User

標籤:

轉載:http://www.educity.cn/develop/1407905.html,並整理!

 

  對於C# Lambda的理解我們在之前的文章中已經講述過了,那麼作為Delegate的進化使用,為了讓代碼簡潔和優雅的呈現,C# Lambda運算式的使用功不可滅,那麼依託外部條件如何動態構建C# Lambda運算式呢。下面讓我們來具體的看看實施。

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

 

  1、首先我們瞭解一個簡單C# Lambda運算式的構成。

i => i > 5 

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

  2、我們通過一些例子,來學習如何動態構建C# Lambda運算式。

  動態構建C# Lambda運算式例子①

  1、準備例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

  2、要實現的運算式 

var r = ints.Where(i => i > 5);   

  3、動態建立該運算式具體代碼

// 建立參數 i  var parameter =   Expression.Parameter(typeof(int), "i");     // 建立常量5  var constant =   Expression.Constant(5);     // 建立比較運算式 i > 5  var bin =   Expression.GreaterThan(parameter, constant);     // 擷取Lambda運算式  var lambda =   Expression.Lambda<Func<int, bool>>(bin, parameter);     // 通過 Compile 方法擷取 Delegate  var _r = ints.Where(lambda.Compile());

  

  動態構建C# Lambda運算式例子②

  1、準備例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

  2、要實現的運算式 

var r = ints.Where(i => i > 5 && i <= 7); 

  3、動態建立該運算式具體代碼

// 建立參數 i  var parameter =   Expression.Parameter(typeof(int), "i");     // 建立運算式 i > 5   var con1 =   Expression.Constant(5);  var bin1 =   Expression.GreaterThan(parameter, con1);     // 建立運算式 i <= 7  var con2 =   Expression.Constant(7);  var bin2 =   Expression.LessThanOrEqual(parameter, con2);     // 組合兩個運算式  var body =   Expression.And(bin1, bin2);     // 擷取 Lambda 運算式  var lambda =   Expression.Lambda<Func<int, bool>>(body, parameter);     var _r = ints.Where(lambda.Compile());  

  在例子②中,我們對複雜的運算式進行了分解,並使用 And 完成多個運算式的組裝,由此我們可以建立更加複雜的邏輯組合,比如例子③。

 

  動態構建C# Lambda運算式例子③

  1、準備例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  

  2、要實現的運算式 

var r = ints.Where(i => (i > 5 && i <= 7) || (i == 3));

  3、動態建立該運算式具體代碼

// 建立參數 i  var parameter =   Expression.Parameter(typeof(int), "i");   // 建立運算式 i > 5  var con1 =   Expression.Constant(5);  var bin1 =   Expression.GreaterThan(parameter, con1);   // 建立運算式 i < 7  var con2 =   Expression.Constant(7);  var bin2 =   Expression.LessThanOrEqual(parameter, con2);   // 建立運算式 i == 3  var con3 =   Expression.Constant(3);  var bin3 =   Expression.Equal(parameter, con3);   // 組合 i > 5 && i <= 7  var body =   Expression.And(bin1, bin2);   // 組合 ( i > 5 && i <= 7) OR (i == 3)  body = Expression.Or(body, bin3);   var lambda =   Expression.Lambda<Func<int, bool>>  (body, parameter);  var _r = ints.Where(lambda.Compile());  

  

  動態構建C# Lambda運算式例子④

  1、準備例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  

  2、要實現的運算式 

var r = ints.Select(i => i % 2 == 0 ? i : 0); 

  3、動態建立該運算式具體代碼

// 建立參數 i  var parameter =   Expression.Parameter(typeof(int), "i");   // 建立運算式 i % 2  var con1 =   Expression.Constant(2);  var bin1 =   Expression.Modulo(parameter, con1);   // 建立運算式 (i % 2) == 0  var con2 =   Expression.Constant(0);  var bin2 =   Expression.Equal(bin1, con2);   // 建立運算式 IIF(((i % 2) = 0), i, 0)  var bin3 =   Expression.Condition  (bin2, parameter, Expression.Constant(0));   var lambda =   Expression.Lambda<Func<int, int>>(bin3, parameter);  var _r = ints.Select(lambda.Compile());

  動態構建C# Lambda運算式例子⑤

  1、準備例子

var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  

  2、要實現的運算式 

Array.ForEach<int>(ints, i => Console.WriteLine(i));

  3、動態建立該運算式具體代碼

// 建立參數i  var parameter =   Expression.Parameter(typeof(int), "i");   // 擷取 Console.WriteLine MethodInfo  MethodInfo method =   typeof(Console).GetMethod(  "WriteLine", new Type[] { typeof(int) });   // 建立運算式   var call = Expression.Call(method, parameter);   var lambda =   Expression.Lambda<Action<int>>(call, parameter);  Array.ForEach<int>(  ints, lambda.Compile());  

  

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

  動態構建C# Lambda運算式的基本內容就向你介紹到這裡,希望那個對你瞭解和掌握使用動態構建C# Lambda運算式有所協助。

動態產生C# Lambda運算式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.