动态生成C# Lambda表达式

转载:http://www.educity.cn/develop/1407905.html,并整理!html

 

  对于C# Lambda的理解咱们在以前的文章中已经讲述过了,那么做为Delegate的进化使用,为了让代码简洁和优雅的呈现,C# Lambda表达式的使用功不可灭,那么依托外部条件如何动态构建C# Lambda表达式呢。下面让咱们来具体的看看实施。数据库

  或许你会奇怪这个需求是如何产生的…… 首先,Lambda 在 DLinq 中承担了以往 T-SQL 的部分角色;其次,在数据库设计中,咱们每每须要依据外部未知的动态条件组合来查询数据。而问题在于做为一种静态语言,咱们显然没法用动态语法或者拼接字符串的方法来建立一个Delegate/Lambda,那么如何达到相似的目的呢?CodeDom?Emit?或许最佳的选择是 System.Linq.Expressions.Expression。数据库设计

 

一、首先咱们了解一个简单C# Lambda表达式的构成。

i => i > 5 

  在这个表达式中,"i" 被称为 Parameter,"i > 5" 是 Body。咱们能够对 Body 进行更进一步的分解,那么 "i > 5" 分别包含参数(i)、操做符(>)以及一个常数(5)。全部这些经过特定顺序的组合,从而构建一个完整的 Lambda 表达式。学习

二、咱们经过一些例子,来学习如何动态构建C# Lambda表达式。

  动态构建C# Lambda表达式例子①

  一、准备例子spa

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

  二、要实现的表达式 设计

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

  三、动态建立该表达式具体代码htm

// 建立参数 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表达式例子②

  一、准备例子blog

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

  二、要实现的表达式 ci

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

  三、动态建立该表达式具体代码字符串

// 建立参数 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表达式例子③

  一、准备例子

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

  二、要实现的表达式 

var r = ints.Where(i => (i > 5 && i <= 7) || (i == 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表达式例子④

  一、准备例子

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

  二、要实现的表达式 

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

  三、动态建立该表达式具体代码

// 建立参数 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表达式例子⑤

  一、准备例子

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

  二、要实现的表达式 

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

  三、动态建立该表达式具体代码

// 建立参数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表达式有所帮助。

相关文章
相关标签/搜索