转载: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表达式的更多相关文章

  1. 动态LINQ(Lambda表达式)构建

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  2. 动态LINQ(Lambda表达式)

    1.准备数据实体 public class Data { public string AccountNO { get; set; } public int Count { get; set; } } ...

  3. Ext.ux.grid.feature.Searching 解析查询参数,动态产生linq lambda表达式

    上篇文章中http://www.cnblogs.com/qidian10/p/3209439.html我们介绍了如何使用Grid的查询组建,而且将查询的参数传递到了后台. 那么我们后台如何介绍参数,并 ...

  4. C# 动态构建表达式树(一)—— 构建 Where 的 Lambda 表达式

    C# 动态构建表达式树(一)-- 构建 Where 的 Lambda 表达式 前言 记得之前同事在做筛选功能的时候提出过一个问题:如果用户传入的条件数量不确定,条件的内容也不确定(大于.小于和等于), ...

  5. easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展

    EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...

  6. Lambda表达式详解

    前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...

  7. lambda表达式-转载

    来源:http://www.cnblogs.com/knowledgesea/p/3163725.html   前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸 ...

  8. C# lambda表达式(简单易懂)

    前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸lambda吧:简化了匿名委托的使用,让你让代码更加简洁,优雅.据说它是微软自c#1.0后新增的最重要的功能之一 ...

  9. C# Lambda表达式详解,及Lambda表达式树的创建

    最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...

随机推荐

  1. 学生信息管理系统应用ios源码iPad版

    学生信息管理系统应用iPad版,该应用源码比较完整的,而且也很详细,这也是一款学校用的学生和老师管理系统,里面涉及到了很多ipad常用的控件,操作和数据存储. <ignore_js_op> ...

  2. POJ C++程序设计 编程题#1 编程作业—STL1

    编程题#1 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面的程序输出结 ...

  3. php中iconv函数使用方法

    最近在做一个程序,需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些. iconv函数库能够完成各种字符集 ...

  4. java枚举类型使用笔记

    1.values()方法返回枚举所有实例的一个数组,调用这个数组的length方法,可以得到这个枚举对象中实例的个数 2.枚举类的每个实例,其实都是static的,可以通过static方法直接调用,而 ...

  5. Google搜索镜像

    From:http://www.cnblogs.com/killerlegend/p/3783744.html Date:2014.6.12 By KillerLegend Google 搜索:htt ...

  6. DELPHI XE5 FOR ANDROID 模仿驾考宝典 TMEMO 控件随着字数增多自动增高

    在一个安卓需求中,需要模仿驾考宝典的详解部分.琢磨了好几天.终于搞定: MemoAns.Height:=10;//MEMO控件赋初始高度值 MemoAns.Lines.Clear; MemoAns.W ...

  7. 可以获取get post url 传递参数的统一方法

    public static string objRequest(string requestName) { object obj = HttpContext.Current.Request[reque ...

  8. Kafka入门学习随记(二)

    ====Kafka消费者模型 参考博客:http://www.tuicool.com/articles/fI7J3m --分区消费模型 分区消费架构图 图中kafka集群有两台服务器(Server), ...

  9. C开发 中原子性操作 , 除了快什么都不剩下了

    题外话 今天,听歌曲听到一首缅怀迈克尔·杰克逊的歌曲 如下: http://music.163.com/#/song?id=1696048  Breaking News 每次听迈克尔 音乐,特别有战斗 ...

  10. 学习KMP算法

    int kmp(char * t,int lenT,char * pat,int lenPat){ ,posT=; int[] f=partialMatch(pat,lenPat)//获取pat字符串 ...