天天看点

C#进阶系列——动态Lamada

前言:在DDD系列文章里面,我们在后台仓储里面封装了传递Lamada表达式的通用方法,类似这样:

通过前端传过来的Lamada表达式,直接放到Where条件里面查询。那么问题来了,我们前端如何传入Lamada呢?当然,有人说了,这个不用传啊,前端直接.Find(x=>x.Name=="abc")这样写就好了啊。确实,如果前端条件只有一个条件,你确实可以这样简单处理,但是实际开发的过程中,我们很多时候是需要传递多个参数,并且.Find(x=>x.Name=="abc")这种写法也不利于方法的封装。于是,我们神奇的动态Lamada诞生了。

之前在介绍委托的时候我们介绍过一种特殊的匿名委托,它型如:

也就是说,不用定义一种具体的委托方法去对应SayHello(string name);,而直接delegate(string name){}这样定义一种匿名的委托去执行,这样能减少部分定义具体方法的代码。

了解了匿名委托的概念,我们来看看我们经常使用的Linq里面的扩展方法Where、Select等。先来看看一般用法:

我们来将Where里面的x => x.Contains("_")分解。

有没有很强大,是不是一样一样的。其实这样一看lamada就是匿名委托的缩略形式。x => x.Contains("_")表达式左边的表示Func里面的string类型变量,x.Contains("_")表示bool类型的返回值。有了这份进化史,程序员再也不用担心面试官问我Lamada怎么回事了。

与其叫动态Lamada,更加严谨一点应该叫动态Expression,因为拼接Lamada表达式用的基本都是Expression的类和方法。博主习惯,暂且就叫它动态Lamada吧。废话不多说,直接吃点栗子吧。

以上就构造了一个查询List<DTO_ORDER>对象里面ORDER_NO 属性等于aaaa的lamada表达式。我们看看运行效果截图:

C#进阶系列——动态Lamada

是不是已经得到了我们想要的表达式!有没有很简单。。。

看到这里有人就郁闷了,为了得到x=>x.ORDER_NO=="aaaa"这种表达式,你绕了这么大一圈,有什么屌用?直接lstRes=lstRes.Where(x=>x.ORDER_NO=="aaaa");就能够搞定的事,你非要把简单问题复杂化。其实不然,有一定编程经验的朋友肯定知道,一般我们前端传过来的查询参数肯定不会只有一个,当需要查询多个参数时需要我们构造一个统一的Lamada传递到后台;当然你也可以说,我将多个参数全部传递到后台,然后再后台使用IQueryable接口去过滤。当然,这确实可行,但是别忘了我们封装Find(Expression exp...)的意义,不就是为了简化方法么,从这点来说,构造动态Lamada非常必要。

博主封装了一个简单操作(大于、等于、小于、like等)的动态Lamada类。

博主项目中有某一个页面,查询条件非常多,需要传递到后台很多参数。先来看看页面:

C#进阶系列——动态Lamada

 来看后台web api代码

仓储基类里面的find方法:

至此,所谓的动态Lamada就完了。如果你之前用过,请一笑而过;当然如果你没用过,学习点新东西也是好的。请不要嘲笑博主乱下定义,叫动态Lamada挺好的呢。当然你可以叫动态Expression,动态Linq都行,不管叫什么,正确使用才是王道。